पाइप के साथ लोकेल फाइल सिस्टम फोल्डर से वर्चुअनव में पायथन पैकेज स्थापित करना


346

क्या स्थानीय फाइल सिस्टम से पाइप का उपयोग करके पैकेज स्थापित करना संभव है?

मैंने python setup.py sdistअपने पैकेज के लिए दौड़ लगाई है, जिसने उचित tar.gz फ़ाइल बनाई है। यह फ़ाइल मेरे सिस्टम पर संग्रहीत है /srv/pkg/mypackage/mypackage-0.1.0.tar.gz

अब एक आभासी वातावरण में मैं या तो पीपीआई से या विशिष्ट स्थानीय स्थान से आने वाले पैकेजों को स्थापित करना चाहूंगा /srv/pkg

क्या यह संभव है?

PS मुझे पता है कि मैं निर्दिष्ट कर सकता हूं pip install /srv/pkg/mypackage/mypackage-0.1.0.tar.gz। यह काम करेगा, लेकिन /srv/pkgमैं टाइप करने के लिए पाइप को खोजने के लिए किसी अन्य स्थान के रूप में स्थान का उपयोग करने के बारे में बात कर रहा हूं pip install mypackage


मैं WHL व्हील से, सेटअप के बिना एक PyPi पैकेज स्थापित करना चाह रहा था, और यह मेरे पायथन संस्करण के लिए एक सही संस्करण डाउनलोड करने के बाद स्थापित हो गया, और चला गया pip install <Path-to-WHL-file>
विकटोरिया स्ट्रीब्यूव

जवाबों:


136

मुझे पूरा यकीन है कि आप जो खोज रहे हैं उसे --find-linksविकल्प कहा जाता है।

यद्यपि आपको index.htmlअपने स्थानीय पैकेज इंडेक्स के लिए डमी उत्पन्न करने की आवश्यकता हो सकती है जो सभी पैकेजों के लिंक को सूचीबद्ध करता है। यह उपकरण मदद करता है:

https://github.com/wolever/pip2pi


100
pip install mypackage --no-index --find-links file:///srv/pkg/mypackageकार्य करना चाहिए।
JFS

1
यह मदद करता है। और हम इसे स्थानीय PyPI के रूप में मानने के लिए पाइप के -i विकल्प का उपयोग कर सकते हैं ।
डायब्लोनो

समतुल्य easy_install कमांड हैeasy_install --allow-hosts=None --find-links file:///srv/pkg/mypackage mypackage
Wilfred Hughes

मुझे काम करने से पहले एक सोर्स डिस्ट्रीब्यूशन फाइल बनानी होगी, न कि उसे प्रोजेक्ट या पैकेज डायरेक्टरी में लाने की। इसने मुझे उलझा दिया। docs.python.org/3.6/distutils/sourcedist.html
जोश

3
ध्यान दें कि --find-linksअभी भी PyPI पर खोज करने की अनुमति देगा यदि पैकेज निर्दिष्ट स्थान में नहीं मिला है या यदि कोई नया संस्करण उपलब्ध है। विंडोज पर, मुझे लगता है कि इस --only-binary=packagename(या --only-binary=:all:) के साथ संयोजन असाधारण रूप से उपयोगी है। यह पाइप को मूल निर्भरता वाले किसी भी पैकेज को डाउनलोड करने की कोशिश करने से रोकता है, जिसमें केवल PyPI पर स्रोत वितरण होता है (और इस प्रकार संकलन की आवश्यकता होती है), जो कि एक निर्देशिका से स्थापित करने के लिए मेरे पास सबसे आम कारण है। इसके विपरीत --no-index, मैं अभी भी PyPI से अन्य पैकेज स्थापित कर सकता हूं।
jpmc26

463

व्हाट अबाउट::

pip install --help
...
  -e, --editable <path/url>   Install a project in editable mode (i.e. setuptools
                              "develop mode") from a local project path or a VCS url.

जैसे, pip install -e /srv/pkg

जहाँ / srv / pkg शीर्ष-स्तरीय निर्देशिका है जहाँ 'setup.py' पाया जा सकता है।


49
यह पैकेज को विकसित मोड में स्थापित करेगा, जिसका अर्थ है कि यह केवल वापस लिंक करेगा जहां स्रोत हैं। अगर किसी भी तरह से स्रोतों को स्थानांतरित या हटा दिया जाता है, तो पैकेज आयात करना विफल हो जाएगा।
त्रासपलाजियो गार्जुग्लियो

3
@MarcoDinacci क्या दिलचस्प --editableहै, यह लगता है कि यह स्थानीय पैकेज की निर्देशिका पर गौर करता है और स्रोत को गिट रेपो के रूप में सेट करता है यदि कोई हो - बस एक फ़ोल्डर की तुलना में थोड़ा अधिक लचीला। मैं हालांकि इसके लिए प्रलेखन नहीं ढूँढ सकता।
NotSimon

3
जब तक यह किसी विशेष पैकेज को स्थापित करने के लिए सही है, विशेष रूप से एक स्थानीय मशीन या वीसीएस यूआरएल पर वर्तमान / गहन विकास में। यह एक विशेष पैकेज स्रोत के विपरीत सभी स्थानीय पैकेज स्रोतों के लिए मूल निर्देशिका खोजने के बारे में सवाल का जवाब नहीं देता है । स्वीकृत उत्तर तब काम करता है जब आपके पास एक निर्देशिका होती है या कई पैकेजों के साथ यूआरएल होता है जिनसे आप स्थापित करना चाहते हैं।
गेविन

@MarcoDinacci हालांकि, मानती है कि कोई उपयोगकर्ता कोड डाउनलोड करता है। वे इसे डालते हैं जहां वे चाहते हैं कि कार्यक्रम हो, अगर वे उस बुद्धिमान हैं। वे इसे स्थानांतरित क्यों करना चाहेंगे?
ज़ेल्फ़िर कलस्टहल

1
@ साइमन एक तरीका है जिसे बताने के लिए पाइप को गिट रेपो की तलाश नहीं करनी चाहिए? अगर मैं do pip install -egit रिमोट से कोड की जांच करता हूं, तो मैं कोड इंस्टॉल करना चाहूंगा जैसा कि यह है (रिमोट में अभी तक बदलाव नहीं हुआ है)।
पेड्रू

39

मैं स्थापित कर रहा हूं pyfuzzyलेकिन PyPI में नहीं है; यह संदेश देता है No matching distribution found for pyfuzzy:।

मैंने स्वीकृत उत्तर की कोशिश की

pip install  --no-index --find-links=file:///Users/victor/Downloads/pyfuzzy-0.1.0 pyfuzzy

लेकिन यह या तो काम नहीं करता है और निम्नलिखित त्रुटि लौटाता है:

इंडेक्स की अनदेखी करना: https://pypi.python.org/simple एकत्रित करना pyfuzzy एक ऐसा संस्करण नहीं खोज सका जो आवश्यकता pyfuzzy को संतुष्ट करता हो (संस्करणों से:) pyfuzzy के लिए कोई मिलान वितरण नहीं मिला

अंत में, मुझे वहाँ एक अच्छा तरीका मिल गया है: https://pip.pypa.io/en/latest/reference/pip_install.html

Install a particular source archive file.
$ pip install ./downloads/SomePackage-1.0.4.tar.gz
$ pip install http://my.package.repo/SomePackage-1.0.4.zip

तो मेरे लिए निम्न कमांड काम किया:

pip install ../pyfuzzy-0.1.0.tar.gz.

उम्मीद है, यह आपकी मदद कर सके।


4
इसने मेरे लिए काम किया। मैंने अन्य तरीकों की कोशिश की और Could not find a version that satisfiesगलती से ठोकर खाई । धन्यवाद।
रीयर

21

यह वह समाधान है जिसका मैंने उपयोग किया है:

import pip


def install(package):
    # Debugging
    # pip.main(["install", "--pre", "--upgrade", "--no-index",
    #         "--find-links=.", package, "--log-file", "log.txt", "-vv"])
    pip.main(["install", "--upgrade", "--no-index", "--find-links=.", package])


if __name__ == "__main__":
    install("mypackagename")
    raw_input("Press Enter to Exit...\n")

मैंने इसे पाइप स्थापित उदाहरणों के साथ-साथ एक अन्य प्रश्न पर रिकार्ड के उत्तर से भी जोड़ दिया । "--Pre" तर्क आपको गैर-उत्पादन संस्करण स्थापित करने देता है। "-नो-इंडेक्स" तर्क PyPI इंडेक्स को खोजने से बचता है। "--Find- लिंक ="। स्थानीय फ़ोल्डर में तर्क खोज (यह सापेक्ष या निरपेक्ष हो सकता है)। मैंने डिबगिंग के लिए "--log-file", "log.txt", और "-vv" तर्कों का उपयोग किया। "- अपग्रेड" तर्क आपको पुराने संस्करणों पर नए संस्करण स्थापित करने देता है।

मुझे उन्हें अनइंस्टॉल करने का एक अच्छा तरीका भी मिला। यह उपयोगी है जब आपके पास कई अलग-अलग पायथन वातावरण होते हैं। यह एक ही मूल प्रारूप है, "अनइंस्टॉल" के बजाय "अनइंस्टॉल" का उपयोग करते हुए, बिना किसी अनइंस्टॉल को रोकने के लिए एक सुरक्षा उपाय के साथ:

import pip


def uninstall(package):
    response = raw_input("Uninstall '%s'? [y/n]:\n" % package)
    if "y" in response.lower():
        # Debugging
        # pip.main(["uninstall", package, "-vv"])
        pip.main(["uninstall", package])
    pass


if __name__ == "__main__":
    uninstall("mypackagename")
    raw_input("Press Enter to Exit...\n")

स्थानीय फ़ोल्डर में ये फ़ाइलें हैं: install.py, uninstall.py, mypackagename-1.0.zip


1
धन्यवाद। "--Find- लिंक ="। और "-नो-इंडेक्स", जहां मेरे यूटिलिटी-पैकेज के अंदर एक पाइथन-स्क्रिप्ट को एक साथ मिलाने की कुंजी है, जो पहले साइट-पैकेज से पुराने-संस्करण-पैकेज को हटाता है और फिर एक उप-संस्करण से एक tar.gz'ed पैकेज स्थापित करता है। उपयोगिता-पैकेज-फ़ोल्डर के बारे में (--find-links =। के बारे में नहीं जानता था), फिर पहिया बनाता है और इसे स्थापित करता है। सभी बेर और क्लिक के माध्यम से स्वचालित। अगर कोई इसे चाहता है, तो मैं एक लिंक पोस्ट करूंगा। Upvoted।
जैकलेइमरदेउर

15

एक विकल्प --find- लिंक काम करता है और यह requirements.txtफ़ाइल से काम करता है !

आप किसी न किसी फ़ोल्डर में पैकेज अभिलेखागार रख सकते हैं और नवीनतम फ़ाइल को बदल सकते हैं, उदाहरण के लिए requirements:

.
└───requirements.txt
└───requirements
    ├───foo_bar-0.1.5-py2.py3-none-any.whl
    ├───foo_bar-0.1.6-py2.py3-none-any.whl
    ├───wiz_bang-0.7-py2.py3-none-any.whl
    ├───wiz_bang-0.8-py2.py3-none-any.whl
    ├───base.txt
    ├───local.txt
    └───production.txt

अब requirements/base.txtडाल में:

--find-links=requirements
foo_bar
wiz_bang>=0.8

मालिकाना पैकेजों को अपडेट करने का एक अच्छा तरीका, बस फ़ोल्डर में एक नया ड्रॉप करें

इस तरह आप से संकुल स्थापित कर सकते हैं local folderऔर pypiएक ही एकल कॉल के साथ:pip install -r requirements/production.txt

पुनश्च। आवश्यकताओं को विभाजित करने और फ़ोल्डर आधारित आवश्यकताओं के संगठन का उपयोग करने के तरीके को देखने के लिए मेरा कुकीजेटर-डीजंगोपैकेज कांटा देखें।


धन्यवाद, यह उससे भी बेहतर है जो मैं करने की सोच रहा था!
फाउंडन

12

से स्थापना-संकुल पेज आप बस चला सकते हैं:

पाइप स्थापित / एसआरवी / पीकेजी / मायपैकेज

जहाँ / srv / pkg / mypackage डायरेक्टरी है, जिसमें setup.py है


इसके अतिरिक्त 1 , आप इसे संग्रह फ़ाइल से स्थापित कर सकते हैं:

पाइप स्थापित करें ।/mypackage-1.0.4.tar.gz

1 हालांकि सवाल में उल्लेख किया गया है, इसकी लोकप्रियता के कारण, यह भी शामिल है।


2
यह डिफ़ॉल्ट उत्तर होना चाहिए। यदि आपको पता है कि स्थानीय मशीन पर आपका पैकेज कहां है, तो आपको --find-links के साथ पाइप हंट बनाने की कोई आवश्यकता नहीं है।
राबर्ट

6

मान लें कि आपके पास virtualenv और एक requirements.txtफ़ाइल है, तो आप इस फ़ाइल के अंदर परिभाषित कर सकते हैं कि पैकेज कहाँ से प्राप्त करें:

# Published pypi packages 
PyJWT==1.6.4
email_validator==1.0.3
# Remote GIT repo package, this will install as django-bootstrap-themes
git+https://github.com/marquicus/django-bootstrap-themes#egg=django-bootstrap-themes
# Local GIT repo package, this will install as django-knowledge
git+file:///soft/SANDBOX/python/django/forks/django-knowledge#egg=django-knowledge

5

एक निर्देशिका के रूप में requirements.txtऔर इसमें आवश्यकताएं होनाegg_dir

आप अपना स्थानीय कैश बना सकते हैं:

$ pip download -r requirements.txt -d eggs_dir

फिर, उस "कैश" का उपयोग करना सरल है:

$ pip install -r requirements.txt --find-links=eggs_dir


1

केवल स्थानीय से स्थापित करने के लिए आपको 2 विकल्प चाहिए:

  • --find-links: जहां निर्भरता के लिए देखने के लिए। file://दूसरों द्वारा उल्लिखित उपसर्ग की कोई आवश्यकता नहीं है ।
  • --no-index: गुम निर्भरता ( --find-linksपथ में स्थापित नहीं है और निर्भरता) के लिए pypi अनुक्रमित में मत देखो ।

तो आप निम्न में से किसी भी फ़ोल्डर से भाग सकते हैं:

pip install --no-index --find-links /srv/pkg /path/to/mypackage-0.1.0.tar.gz

यदि आपका mypackage ठीक से सेटअप है, तो यह उसके सभी आश्रितों को सूचीबद्ध करेगा, और यदि आपने निर्भरता (यानी निर्भरता आदि की निर्भरता) के कैस्केड को डाउनलोड करने के लिए पाइप डाउनलोड का उपयोग किया है, तो सब कुछ काम करेगा।

यदि आप pypi इंडेक्स का उपयोग करना चाहते हैं यदि यह सुलभ है, लेकिन स्थानीय पहियों पर कमबैक है यदि नहीं, तो आप हटा सकते हैं --no-indexऔर जोड़ सकते हैं --retries 0। आपको थोड़ी देर के लिए पिप पॉज़ दिखाई देगा, जबकि यह एक गुम निर्भरता (एक स्थापित नहीं) के लिए पिपी की जांच करने की कोशिश करता है और जब यह पाता है कि यह उस तक नहीं पहुंच सकता है, तो वापस स्थानीय पर गिर जाएगी। "स्थानीय लोगों को पहले देखो, फिर सूचकांक" के लिए पाइप को बताने का एक तरीका प्रतीत नहीं होता है।


-1

मैं वास्तव में कुछ सरल और बुरी तरह से असफल होने की कोशिश कर रहा हूं, शायद मैं बेवकूफ हूं।

वैसे भी, यदि आपके पास एक स्क्रिप्ट है / Dockerfileजो एक अजगर पैकेज ज़िप फ़ाइल (जैसे GitHub से) डाउनलोड करता है और आप इसे स्थापित करना चाहते हैं, तो आप इसे स्थापित करने के लिए file:///उपसर्ग का उपयोग कर सकते हैं जैसा कि निम्नलिखित उदाहरण में दिखाया गया है :

$ wget https://example.com/mypackage.zip
$ echo "${MYPACKAGE_MD5}  mypackage.zip" | md5sum --check -
$ pip install file:///.mypackage.zip

नोट : मैं आप पैकेज स्थापित कर सकता है सीधे का उपयोग कर पता pip install https://example.com/mypackage.zipलेकिन मेरे मामले में मैं चेकसम (कभी नहीं पागल पर्याप्त) सत्यापित करने के लिए करना चाहता था और मैं बुरी तरह जब विभिन्न विकल्पों कि पिप प्रदान करता है / उपयोग करने की कोशिश में विफल रहा है #md5टुकड़ा।

यह आश्चर्यजनक रूप से कुछ ऐसा करने में प्रत्यक्ष रूप से निराश करने वाला है pip। मैं सिर्फ एक चेकसम पास करना चाहता था और यह pipसत्यापित कर चुका था कि इसे स्थापित करने से पहले ज़िप मेल कर रहा था ।

मैं शायद कुछ ज्यादा ही बेवकूफी कर रहा था लेकिन अंत में मैंने हार मान ली और इसके लिए चुना। मुझे आशा है कि यह दूसरों को कुछ ऐसा ही करने की कोशिश करने में मदद करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.