2015-01-01 10 views
22

कई पायथन पैकेजों में गैर-पायथन पैकेज पर निर्भरताएं हैं। मैं विशेष रूप से एलएक्सएमएल और सीएफआई के बारे में सोच रहा हूं, लेकिन यह दुविधा पीपीपीआई पर कई पैकेजों पर लागू होती है। इन दोनों पैकेजों में non-Python संकुल जैसे libxml2-dev, libxslt-dev, zlib1g-dev, और libffi-dev पर अनजान बिल्ड निर्भरताएं हैं। एलएक्सएमएल और सीएफआई के लिए वेबसाइटें इन निर्भरताओं में से कुछ घोषित करती हैं, लेकिन ऐसा लगता है कि कमांड लाइन से इसे समझने का कोई तरीका नहीं है।गैर-पायथन निर्भरताओं वाले पैकेज को 'पाइप इंस्टॉल' कैसे करें?

pip install foo fails with an error: "fatal error: bar.h: No such file or directory". How do I fix it?

इस pip के दुरुपयोग है या यह कैसे काम करने का इरादा है इस है:

नतीजतन, वहाँ इतना है कि यह सामान्य रूप ले पर सवाल के सैकड़ों रहे हैं? क्या pip चलाने से पहले स्थापित करने के लिए निर्माण निर्भरताओं को जानने का कोई सौहार्दपूर्ण तरीका है? मेरा वर्तमान दृष्टिकोण है:

  1. मैं foo नामक एक पैकेज स्थापित करना चाहता हूं।
  2. pip install foo
  3. foo एक अजगर पैकेज bar पर एक निर्भरता है।
    • यदि bar बिल्ड विफल रहता है, तो त्रुटि संदेश देखें और अनुमान लगाएं/Google जो गैर-पायथन निर्भरता स्थापित करने की आवश्यकता है।
    • sudo apt-get install libbaz-dev
    • sudo pip install bar
    • bar जब तक दोहराएँ सफल होता है।
  4. sudo pip uninstall foo
  5. कोई त्रुटि संदेश जब तक दोहराएँ पूरी प्रक्रिया।

चरण # 4 विशेष रूप से परेशान है। स्पष्ट रूप से pip (संस्करण 1.5.4) किसी भी निर्भरता से पहले अनुरोधित पैकेज को पहले, इंस्टॉल करता है। इसलिए यदि कोई निर्भरता विफल हो जाती है, तो आप इसे फिर से स्थापित करने के लिए pip से नहीं पूछ सकते हैं, क्योंकि ऐसा लगता है कि यह पहले से स्थापित है। केवल निर्भरताओं को स्थापित करने के लिए कोई विकल्प नहीं है, इसलिए आपको पैकेज को अनइंस्टॉल करना होगा और फिर उसे पुनर्स्थापित करना होगा।

pip का उपयोग करने के लिए कुछ और बुद्धिमान प्रक्रिया है?

+1

जो कुछ के लिए यह लायक है, यही कारण है कि वहाँ वैज्ञानिक दुनिया के लिए इतने सारे अजगर पैकेज प्रबंधक हैं। विंडोज या OSX पर (जैसे "अजगर वितरण" 'conda' और' enpkg' की तरह पैकेज प्रबंधकों, इस तरह के 'bento', और कम प्रसिद्ध लोगों कि मैं भूल रहा का एक समूह के रूप में प्रतिस्थापन setuptools), एक पैकेज मेंटेनर एक वितरित कर सकते हैं सभी आवश्यक पुस्तकालयों के साथ बाइनरी व्हील, लेकिन लिनक्स/बीएसडी सिस्टम पर, यह गारंटी देना कठिन होता है कि सिस्टम पायथन किस कंपाइलर के साथ बनाया गया था। किसी भी दर पर, जहां तक ​​मुझे पता है, distutils मेटाडेटा में बाहरी निर्भरताओं को निर्दिष्ट करने का कोई तरीका नहीं है। –

+2

मुझे लगता है कि समस्या का हिस्सा ऑपरेटिंग सिस्टम और गतिशील लिंकर्स के काम में भी निहित है। आदर्श रूप में, आप स्मृति के साथ अधिक कुशल होने के लिए ओएस में साझा पुस्तकालयों का लाभ लेना चाहते हैं। हालांकि, आप केवल सिस्टम पैकेज मैनेजर के साथ साझा लाइब्रेरी इंस्टॉल कर सकते हैं क्योंकि एक ही रिलीज चक्र में हर दूसरे पैकेज एक निश्चित, सहमत संस्करण पर निर्भर करता है। इस वजह से, पीआईपी और एपीटी के बीच वास्तव में एक विश्वसनीय इंटरफ़ेस नहीं हो सकता क्योंकि पाइप में रिलीज चक्र की कोई अवधारणा नहीं है। डिफ़ॉल्ट रूप से साझा पुस्तकालयों के साथ * नहीं * जहाज हेडर फाइल को –

+0

डेबियन की पसंद कारणों मैं कुछ भी डेबियन से संबंधित दूर से एक है। डेबियन पर "जल्दी से कुछ संकलित" जैसी कोई चीज़ नहीं है, क्योंकि आप हमेशा '-dev' पैकेजों का शिकार कर रहे हैं; यह समस्या 'पीआईपी 'तक सीमित नहीं है। – Carpetsmoker

उत्तर

11

उपयोग कर सकते हैं यह वास्तव में इस सवाल का जवाब apt-get उपयोग करने का सुझाव के बारे में एक टिप्पणी है, लेकिन मैं काफी प्रतिष्ठा अंक एक छोड़ने के लिए नहीं है।

यदि आप virtualenv एक बहुत का उपयोग करें, तो apt-get के माध्यम से अजगर-संकुल स्थापित करने के लिए एक दर्द हो सकता है, जैसा कि आप रहस्यमय त्रुटियों प्राप्त कर सकते हैं जब अजगर संकुल पूरे सिस्टम पर स्थापित और अपनी virtualenv के साथ बातचीत करने की कोशिश अजगर पैकेज स्थापित एक दूसरे।एक चीज जो मैंने पाया है, मदद करता है build-dep सुविधा का उपयोग करना है। matplotlib निर्भरता का निर्माण करने के लिए, उदाहरण के लिए:

sudo apt-get build-dep python-matplotlib 

और फिर अपने आभासी पर्यावरण को सक्रिय करने और pip install matplotlib है। यह अभी भी निर्माण प्रक्रिया के माध्यम से जाएगा लेकिन कई निर्भरताओं का ख्याल रखा जाएगा।

यह जब ubuntu में आर संकुल स्थापित करने क्या cran repositories सुझाव है प्रकार है।

+1

मुझे लगता है कि आपको इसे अकेले स्टैंड में जवाब देना चाहिए, यह बहुत बढ़िया है। –

+0

ट्रैविस के साथ सहमत हैं; यह एक चालाक जवाब है जिसे मैंने कभी नहीं सोचा था। –

1

सबसे लोकप्रिय पैकेजों के लिए, हाल ही में उबंटू सिस्टम के लिए एक कामकाज है। उदाहरण के लिए, मैं matplotlib स्थापित करना चाहता हूं। जब आप pip install matplotlib ऑर्डर करते हैं, तो यह आमतौर पर अनुपलब्ध निर्भरता के कारण विफल रहता है।

आप इसके बजाय apt-get install python-matplotlib का उपयोग कर सकते हैं। python3 के लिए, आप apt-get install python3-matplotlib

+1

वर्चुअल वातावरण में पैकेज स्थापित करने के बारे में क्या? – alecxe

+0

@alecxe मुझे कोई जानकारी नहीं है। मैं वर्चुअल वातावरण के लिए अपने सुझाव का उपयोग करने के लिए वैसे भी नहीं देखता हूं। –

+2

इस दृष्टिकोण के साथ दो समस्याएं हैं: (1) अधिकांश यूबंटू पैकेज अपने पीईपीआई समकक्षों के पीछे बहुत दूर हैं, और (2) 'पीपी' आपके एपीटी पैकेज के बारे में कुछ भी नहीं जानता है, इसलिए यदि मैं पाइथन- matplotlib' और फिर बाद में 'matplotlib'' पर निर्भर कुछ 'पाइप इंस्टॉल' करने का प्रयास करें, 'पीपी'' matplotlib' को फिर से स्थापित करने का प्रयास करेगा। मुझे लगता है कि सभी एपीटी या सभी 'पीआईपी' का उपयोग करना बेहतर है; दोनों के संयोजन सिर्फ भविष्य भ्रम और निराशा को आमंत्रित कर रहा है। –

संबंधित मुद्दे