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




google-app-engine install (8)

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

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

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

पाइप इंस्टॉल- मैं फ्लास्क-आराम से - लक्ष्य ./lib

लेकिन यह विफल रहता है:

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

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

https://code.i-harness.com


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

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

क्या आप ओएस एक्स और होमब्रू का उपयोग कर रहे हैं? होमब्रू पायथन पेज https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md पीआईपी के साथ एक ज्ञात समस्या और आसपास के काम को बुलाता है।

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

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

[install]
prefix=

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


जैसा कि अन्य बताया गया है, यह होमब्री के साथ स्थापित पाइप और पायथन के साथ ज्ञात बग है।

यदि आप "खाली उपसर्ग" निर्देश के साथ ~/.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 फ़ाइल हटा देता है

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


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


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

आपको बस अपनी परियोजना की मूल निर्देशिका में 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 को हटा setup.cfg


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

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

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


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

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

वर्चुअलएएनवी: $ source bin/activate

वर्चुअलफ़िश: $ vf activate [environ]

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


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

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

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





distutils