DistutilsOptionError: दोनों या तो घर या उपसर्ग / निष्पादन-उपसर्ग - दोनों की आपूर्ति करनी चाहिए


144

मुझे आमतौर पर पाइप के माध्यम से अजगर पैकेज स्थापित किए गए हैं।

Google ऐप इंजन के लिए, मुझे संकुल को किसी अन्य लक्ष्य निर्देशिका में स्थापित करने की आवश्यकता है।

मैंने कोशिश की:

पाइप इंस्टाल -I फ्लास्क-रेस्टफुल-target ./lib

लेकिन इसके साथ असफल:

घर या उपसर्ग / निष्पादन-उपसर्ग - दोनों की आपूर्ति करना चाहिए

में इससे कैसे चला सकता हूँ?

जवाबों:


289

क्या आप OS X और Homebrew का उपयोग कर रहे हैं? Homebrew python पेज https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md पाइप और एक काम के साथ एक ज्ञात समस्या को बताता है।

मेरे लिए काम किया।

आप निम्न सामग्री के साथ ~ /। Pydistutils.cfg फ़ाइल जोड़कर इसे "खाली उपसर्ग" डिफ़ॉल्ट बना सकते हैं:

[install]
prefix=

संपादित करें: इस Homebrew अनुशंसित विकल्प का उपयोग न करें, यह सामान्य पाइप संचालन को तोड़ देगा


5
अच्छा सामान, लिंक खराब है, यह वह नई है जिसकी मुझे उम्मीद है: github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/…
patt0

6
ध्यान दें कि फ़ाइल ने मेरे लिए आभासी वातावरण को तोड़ दिया।
Dmytro Sadovnychyi

16
यह खाली उपसर्ग व्यवसाय सामान्य pip installसंचालन को तोड़ता है :(
जाप

10
क्या किसी को पता चला है कि डिफ़ॉल्ट व्यवहार को बर्बाद नहीं--target करते हुए कैसे अनुमति दें ? pip install
रयान्टक

3
यह अब मान्य प्रतीत नहीं होता है। लिंक टूट गया है और अद्यतन लिंक pydistutils.cfg के बारे में बात नहीं करता है
Lucretiel

164

मेरा मानना ​​है कि इस समस्या का एक सरल समाधान है (होमब्रेव पाइथन ऑन मैकओएस) जो आपके सामान्य पाइप संचालन को नहीं तोड़ पाएगा।

आपको बस setup.cfgअपने प्रोजेक्ट की रूट डायरेक्टरी में एक फाइल बनानी है , जहां आमतौर पर आपकी मुख्य __init__.pyया एक्जीक्यूटेबल पाई फाइल होती है। तो अगर आपके प्रोजेक्ट का रूट फोल्डर है: तो वहां /path/to/my/project/एक setup.cfgफाइल बनाएं और उसमें मैजिक शब्द डालें:

[install]
prefix=  

ठीक है, अब आप उस फ़ोल्डर के लिए पाइप के कमांड चलाने में सक्षम होंगे:

pip install package -t /path/to/my/project/  

यह कमांड केवल उस फोल्डर के लिए इनायत से चलेगी। setup.cfgआपके पास जो भी अन्य परियोजनाएं हैं, बस उन्हें कॉपी करें। .pydistutils.cfgअपने घर निर्देशिका पर लिखने की जरूरत नहीं है ।

मॉड्यूल स्थापित करने के बाद, आप निकाल सकते हैं setup.cfg


2
यह पूरी तरह से pip3.6 के साथ भी काम करता है। और मेरी पाइप अभी भी बरकरार है।
हन्नीबल

10
यह स्वीकृत उत्तर होना चाहिए। वैश्विक पाइप सेटिंग्स के साथ समस्या पैदा करने से बचा जाता है।
ट्रिनिट्रॉनएक्स

10
setup.cfgस्थापना भाग के बाद हटाने पर जोर । मैंने पूरे 2 दिन जले, यह जानने की कोशिश की कि मेरा वर्चुअन वातावरण खराब क्यों है, जैसी त्रुटियां हैं Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'। सेटअप फ़ाइल को
हटाकर

1
@ kip2 हां आपके द्वारा सही उल्लेख किया गया है, इसलिए मैंने उस बिट पर जोर देने के लिए जवाब को संपादित किया है, आंद्रेजी कृपया ध्यान दें।
बूल.देव

ध्यान देने के लिए धन्यवाद। क्या यह अधिक सही होगा यदि मैंने कहा कि "मॉड्यूल स्थापित करने के बाद, आपको setup.cfg को हटा देना चाहिए"?
आंद्रे जी

25

OSX (मैक) पर, एक प्रोजेक्ट फ़ोल्डर को संभालने को जिसे / var / myproject कहा जाता है

  1. cd /var/myproject
  2. नामक एक फाइल बनाएं setup.cfgऔर जोड़ें [install] prefix=
  3. Daud pip install <packagename> -t .

1
मुझे यकीन नहीं है कि यह @AndreG जवाब से अलग कैसे है
मैककॉर्मैक

मेरे लिए अंतर यह है कि यह समाधान निर्देशिका में सीडी और -t .डीआईआर के बाहर रहने के बजाय करता है । इस तरह से मेरे लिए काम किया और दूसरे ने नहीं किया, हालांकि मुझे पता नहीं क्यों।
चक विल्बर

12

Homebrew उपयोगकर्ताओं के लिए एक और समाधान * बस एक का उपयोग करने के लिए है virtualenv

बेशक, यह वैसे भी लक्ष्य निर्देशिका की आवश्यकता को दूर कर सकता है - लेकिन भले ही ऐसा न हो, मैंने --targetएक वर्चुअल वातावरण में डिफ़ॉल्ट रूप से (जैसा कि, बिना किसी कॉन्फ़िगर फ़ाइल को बनाए / संशोधित किए) काम किया है।


* मैं कहता हूं समाधान; शायद यह सिर्फ एक और प्रेरणा के लिए सावधानीपूर्वक उपयोग vevs है ...


3
विश्वास नहीं कर सकता यह केवल एक महीने पहले था। बस अपने ही सवाल का जवाब देते हुए खुद को पकड़ा; समय से पहले ...
OJFord

इसलिए, मुझे हाल ही में ओपी के प्रश्न में समस्या थी, और केवल एक virtualenv बनाने से मेरे लिए समस्या हल हो गई। मैं अभी भी लक्ष्य निर्देशिका में स्थापित कर सकता हूं। मेरा मुद्दा अतिरिक्त रूप से जटिल था क्योंकि मैंने python3 को भी स्थापित किया था, लेकिन virtualenv समाधान के लिए +1।
जोश ब्राउन

3

मैंने अन्य अनुशंसाओं के साथ त्रुटियों को मारा --install-option="--prefix=lib"। केवल एक चीज जो मैंने पाया है कि यहांPYTHONUSERBASE वर्णित के रूप में काम कर रही है

export PYTHONUSERBASE=lib
pip install -I flask-restful --user

यह बिल्कुल वैसा ही नहीं है --target, लेकिन यह किसी भी मामले में मेरे लिए चाल है।


2

जैसा कि अन्य उल्लेख किया गया है, यह होमबॉव के साथ स्थापित पाइप और अजगर के साथ बग को जाना जाता है।

यदि आप ~/.pydistutils.cfg"खाली उपसर्ग" निर्देश के साथ फ़ाइल बनाते हैं तो यह इस समस्या को ठीक कर देगा लेकिन यह सामान्य पाइप संचालन को तोड़ देगा।

जब तक इस बग को आधिकारिक रूप से संबोधित नहीं किया जाता है, तब तक विकल्पों में से एक अपनी स्वयं की बैश स्क्रिप्ट बनाने के लिए होगा जो इस मामले को हैंडल करेगा:

 #!/bin/bash

 name=''
 target=''

 while getopts 'n:t:' flag; do
     case "${flag}" in
         n) name="${OPTARG}" ;;
         t) target="${OPTARG}" ;;
     esac
 done

 if [ -z "$target" ];
 then
     echo "Target parameter must be provided"
     exit 1
 fi

 if [ -z "$name" ];
 then
     echo "Name parameter must be provided"
     exit 1
 fi

 # current workaround for homebrew bug
 file=$HOME'/.pydistutils.cfg'
 touch $file

 /bin/cat <<EOM >$file
 [install]
 prefix=
 EOM
 # end of current workaround for homebrew bug

 pip install -I $name --target $target

 # current workaround for homebrew bug
 rm -rf $file
 # end of current workaround for homebrew bug

यह स्क्रिप्ट आपकी आज्ञा को पूरा करती है और:

  1. नाम और लक्ष्य मापदंडों को स्वीकार करता है
  2. जाँच करें कि क्या वे पैरामीटर खाली हैं
  3. ~/.pydistutils.cfgइसमें "खाली उपसर्ग" निर्देश के साथ फाइल बनाता है
  4. प्रदान किए गए मापदंडों के साथ अपने पाइप कमांड को निष्पादित करता है
  5. ~/.pydistutils.cfgफ़ाइल निकालता है

इस स्क्रिप्ट को बदला जा सकता है और अपनी आवश्यकताओं को पूरा करने के लिए अनुकूलित किया जा सकता है, लेकिन आपको विचार मिल सकता है। और यह आपको ब्रेकिंग पाइप के बिना अपनी कमांड चलाने की अनुमति देता है। आशा करता हूँ की ये काम करेगा :)


2

यदि आप virtualenv * का उपयोग कर रहे हैं, तो आपके द्वारा उपयोग किए जा which pipरहे चेक को डबल करना एक अच्छा विचार हो सकता है ।

यदि आपको ऐसा कुछ दिखाई देता है, जैसे /usr/local/bin/pipआप अपने वातावरण से टूट चुके हैं। आपके virtualenv को पुन: सक्रिय करने से यह ठीक हो जाएगा:

virtualenv: $ source bin/activate

VirtualFish: $ vf activate [environ]

*: मैं वर्चुअलफ़िश का उपयोग करता हूं, लेकिन मुझे लगता है कि यह टिप दोनों के लिए प्रासंगिक है।


virtualenv का उपयोग करना वास्तव में मेरे समान मामले में समाधान था :)
chriscatfr

-1

मेरा भी वही मुद्दा है। मैं त्रुटि से बचने के लिए -system ध्वज का उपयोग करता हूं क्योंकि मैं अन्य थ्रेड पर यहां व्याख्या करता हूं जहां मैं अपनी स्थिति के विशिष्ट मामले की व्याख्या करता हूं। मैं यहां यह उम्मीद करते हुए पोस्ट करता हूं कि किसी को भी इसी समस्या का सामना करने में मदद मिल सकती है।

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