কোডের মধ্যে পাইথন মডিউল ইনস্টল করা হচ্ছে


309

আমার স্ক্রিপ্টের মধ্যে পিআইপিআই থেকে আমার সরাসরি একটি প্যাকেজ ইনস্টল করতে হবে। সম্ভবত কিছু মডিউল বা distutils( distribute, pipইত্যাদি) বৈশিষ্ট্য রয়েছে যা আমাকে ঠিক যেমন কিছু সম্পাদন করতে দেয় pypi.install('requests')এবং অনুরোধগুলি আমার ভার্চুয়ালেনভের মধ্যে ইনস্টল করা হবে।


4
আপনি কেন নিজের প্যাকেজের সেটআপ.পিতে নির্ভরতা হিসাবে সম্পর্কিত মডিউলটিকে সংজ্ঞায়িত করবেন না?
আন্দ্রেয়াস জং

5
আপনি জানেন ... যেভাবে এটি করা উচিত ছিল ... তবে আপনি সর্বদা ওএস.সিস্টেম ("পিপ ইনস্টল ব্লাহ") করতে পারতেন তবে আপনার সুডো অ্যাক্সেসের প্রয়োজন হতে পারে ... এটি আপনার সেটআপের উপর নির্ভরশীলতা তৈরি করার জন্য আরও ভাল। পাই
জোড়ান বিসলে

2
আপনি এখানে গৃহীত উত্তর পরিবর্তন বিবেচনা করবেন? আমদানি pipকরা কখনই ভাল ধারণা নয় - কেবলমাত্র সত্য যে এর সমস্ত বিষয়বস্তু _internal10 সংস্করণ থেকে শুরু হচ্ছে ...
অ্যান্টি হাপাল

2
@chuwy stackoverflow.com/a/50255019/918959 <= এই এক। pip._internalআমদানিযোগ্য হওয়ার জন্য ডিজাইন করা হয়নি, অন্য প্রোগ্রামে আমদানি করার সময় এটি একেবারে এলোমেলো জিনিস করতে পারে।
আন্তি হাপালা

3
আন্টিহাপাল ঠিক আছে আমি এটিকে পরিবর্তন করেছি। আমি ব্যক্তিগতভাবে উভয় সমাধান পছন্দ করি না, তবে আজকাল আমি পাইথন থেকে অনেক দূরে, সুতরাং আমি আপনার মতামতকে বিশ্বাস করি।
চুবি

উত্তর:


251

স্ক্রিপ্ট থেকে প্যাকেজ ইনস্টল করার আনুষ্ঠানিকভাবে প্রস্তাবিত উপায় হ'ল পি-র কমান্ড-লাইন ইন্টারফেসকে একটি সাবপ্রসেসের মাধ্যমে কল করা। এখানে উপস্থাপন করা বেশিরভাগ উত্তর পাইপ দ্বারা সমর্থিত নয় । পিপ ভি 10 এর পরে, সমস্ত কোড pip._internalসঠিকভাবে সরানো হয়েছে যাতে ব্যবহারকারীদের কাছে এটি স্পষ্ট করা যায় যে পাইপের ব্যবহারিক প্রোগ্রাম ব্যবহারের অনুমতি নেই।

sys.executableআপনি pipবর্তমান রানটাইমের সাথে সম্পর্কিত একইটিকে কল করবেন তা নিশ্চিত করতে ব্যবহার করুন ।

import subprocess
import sys

def install(package):
    subprocess.check_call([sys.executable, "-m", "pip", "install", package])

এটির সাথে একটি সমস্যা হ'ল, উইন্ডোজে নবজাতক ব্যবহারকারীদের জন্য অজগর এবং পাইপ সর্বদা তাদের পথের উপরে থাকে না এবং সুতরাং একটি .py ফাইল যা ডাবল-ক্লিক করা যেতে পারে তা যথেষ্ট সুবিধাজনক হবে, যেখানে "পিপ ইনস্টল এক্সএক্সএক্সএক্সএক্স" মন্তব্য হতে পারে বেশ জটিল
jdpipe

কল করা প্রসেসরর: কমান্ড '[' সি: \\ প্রোগ্রামডাটা \\ অ্যানাকোন্ডা 3 \\ পাইথনউ.এক্সই ',' -ম ',' পিপ ',' ইনস্টল ',' গুগলাপিক্লিয়েন্ট ']' শূন্য-বহির্গমন প্রস্থানটি ফিরে
পেয়েছে।

381

আপনি এর মতো কিছু ব্যবহার করতে পারেন:

import pip

def install(package):
    if hasattr(pip, 'main'):
        pip.main(['install', package])
    else:
        pip._internal.main(['install', package])

# Example
if __name__ == '__main__':
    install('argh')

3
@nbro আপনি pip.main()কমান্ড লাইনে যেমন বিকল্পগুলি পাস করেছেন (তবে প্রতিটি বিকল্পের সাথে তালিকার পৃথক এন্ট্রি হিসাবে একটি স্ট্রিংয়ের পরিবর্তে)। এবং আপনি যে প্যাকেজটি চান তার কোন সংস্করণ নির্দিষ্ট করতে, কমান্ড লাইনের মতোই করুন .. প্রাক্তন:pip.main(['install', 'pip==7.1.0'])
কাওস

3
এছাড়াও স্ট্যাকওভারফ্লো.com / জিজ্ঞাসাগুলি / 77459977৯9 /… দেখুন , যা কোনও ইনস্টল ব্যর্থ হলে কেস কীভাবে পরিচালনা করবেন তা দেখায়।
পি। মায়ার নোর

24
from pip._internal import main as pipmainতারপর আপনি ব্যবহার করতে পারেন pipmain()মাত্র অননুমোদিত মত pip.main()দেখুন stackoverflow.com/questions/43398961/...
Bjorks এক নম্বর ফ্যান

17
এটি এখন অবমূল্যায়ন।
মোর্স

6
এটি কোনও কারণে অবহিত করা হয়েছে এবং আর প্রস্তাবিত নয়। দেখতে pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
NBK

71

আপনি যদি pipপ্রয়োজনীয় প্যাকেজ ইনস্টল করতে এবং ইনস্টলের পরে এটি আমদানি করতে চান তবে আপনি এই কোডটি ব্যবহার করতে পারেন:

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)


install_and_import('transliterate')

আপনি যদি ব্যবহারকারী হিসাবে কোনও প্যাকেজ ইনস্টল করেন তবে আপনি এমন সমস্যার মুখোমুখি হতে পারেন যা আপনি কেবল প্যাকেজটি আমদানি করতে পারবেন না। রিফ্রেশ কীভাবে দেখুন sys.path? অতিরিক্ত তথ্যের জন্য।


4
পাইথন 3 এ কীভাবে করবেন তা সম্পর্কে কোনও ধারণা? imp.reload(site)আমাকে পেয়ে যায়RuntimeError: dictionary changed size during iteration
কেগাডেক

এটি প্যাকেজটি কোথায় ইনস্টল করে, আমি এটি করার পরে, আমি করতে সক্ষম হইনি pip uninstall <package_name>। আমি এটি ব্যবহার করে এখনও এটি আনইনস্টল করতে পারি pip.mainতবে কেবল জানতে চেয়েছিলাম এটি প্যাকেজটি কোথায় ইনস্টল করে?
hanশান খারে

অদ্ভুত ছিল. এই কাজ সঠিকভাবে যদি আমি করি হবে: pip install requests[security]? আমি নিশ্চিত ছিলাম না যে এটি গ্লোবালগুলি সঠিকভাবে সংজ্ঞায়িত করবে কিনা।
ফ্যালেনেরপেপার

4
সেকেলে. pip.mainআর কাজ করে না pip.pypa.io/en/latest/user_guide/#using-pip-from-your-program
Wim

22

এই কাজ করা উচিত:

import subprocess

def install(name):
    subprocess.call(['pip', 'install', name])

1
হ্যাঁ এটি অবশ্যই কাজ করা উচিত। তবে আমি ভেবেছিলাম আরও মার্জিত উপায় আছে;) আমি কিছুটা অপেক্ষা করব, সেখানেও থাকতে পারে।
chuwy

1
@ ডাউনভোটার: আমার উত্তরে ঠিক কী ভুল? এই উত্তরটি সমস্ত ওপি চেয়েছিল। এটি শেলও ব্যবহার করে না।
কোয়ান্টাম

13
এটি পাইপটির সঠিক সংস্করণে প্রথম দিকে নির্ভর করে। যদি ব্যবহারকারী একটি বিকল্প পাইথন ইনস্টলেশন চালাচ্ছেন তবে পাইপ বর্তমানের পরিবর্তে প্রথমটিতে ইনস্টল করবে। উপরের আমদানি পদ্ধতির সঠিক জায়গায় ইনস্টল করা হবে। ডাউন ভোটকে পাল্টাতে আমি যেভাবেই হোক উন্নত করেছিলাম।
গ্যারিবিশপ

6
স্ক্রিপ্টটি কীভাবে চলছে তার উপর নির্ভর করে আপনি সঠিক পাইপটি কল করবেন না।
নাতিম

5
কলিং [sys.executable, '-m', 'pip', 'install', name]এখানে "ডান" পাইপটি নিশ্চিত করছে।
wim

12

@ হারুনের উত্তরে আমি কিছু ব্যতিক্রম যুক্ত করেছি।

import subprocess
import sys

try:
    import pandas as pd
except ImportError:
    subprocess.check_call([sys.executable, "-m", "pip", "install", 'pandas'])
finally:
    import pandas as pd

1
সাব প্রসেস এবং পাইপের সুন্দর বাস্তবায়ন, এখানে বেশিরভাগ সমাধানের চেয়ে ভাল
শান্তনু শ্যাডি

3
আপনি subprocess.callকোডটি ব্যর্থ হতে পারে তার পুনরায় সংযোগের মানটি পরীক্ষা করছেন না ।
অ্যান্টি হাপালা

5

আপনি "ইনস্টল_রেকায়ারস" বিকল্পটি দিয়ে নিজের প্যাকেজের সেটআপ.পাইয়ের অভ্যন্তরে নির্ভরশীল মডিউলটি সংজ্ঞায়িত করেন।

যদি আপনার প্যাকেজে কিছু কনসোল স্ক্রিপ্ট তৈরি করা দরকার থাকে তবে আপনি "কনসোল_স্ক্রিপ্টস" এন্ট্রি পয়েন্টটি ব্যবহার করতে পারেন যাতে একটি র‌্যাপার স্ক্রিপ্ট তৈরি করা যায় যা 'বিন' ফোল্ডারের মধ্যে স্থাপন করা হবে (যেমন আপনার ভার্চুয়ালনেভ পরিবেশের উদাহরণ)।


1
এটি সঠিক উত্তর এবং পাইথন প্রকল্পগুলির নির্ভরতা পরিচালনা করার একমাত্র বুদ্ধিমান উপায়। এটি ভার্চুয়ালেনভ, ফ্যাব্রিক, বিল্ডআউট নিয়ে কাজ করবে, আপনি এটির নাম দিন। @ Xiaomao দ্বারা বর্ণিত পদ্ধতিটি ওপি যা বলেছিল তার ঠিক উত্তর দিলেও খাঁটি পাগলামি।
লুকাস গ্রাফ

7
যদিও এটি যথাযথ পরামর্শ, এটি জিজ্ঞাসা করা প্রশ্নের উত্তর দেয় না
কোরি গোল্ডবার্গ

2
প্যাকেজিং যখন একটি বিষয় হয়, সেখানে প্রচুর অন্যান্য ব্যবহারের ঘটনা রয়েছে, উদাহরণস্বরূপ পাইথনে লিখিত একটি স্থাপনা স্ক্রিপ্ট।
hoefling
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.