यह समस्या अक्सर तब उत्पन्न होती है जब पाइप एल कैपिटन पर आईपीथॉन के लिए एक मैनपेज स्थापित करने की कोशिश करता है। इस तरह एक पाइप कमांड का उपयोग करने के लिए त्वरित फिक्स है:
sudo -H pip install --install-option '--install-data=/usr/local' <package>
हालांकि, एल कैपिटान पर सिस्टम इंटीग्रिटी प्रोटेक्शन प्रोटेक्शन (एसआईपी) पाइप के साथ कई बुरी प्रथाओं को ब्लॉक करता है, जो कि स्लाइड द्वारा उपयोग किया जाता है, इसलिए आपको एल कैपिटान पर पाइप को आसानी से चलाने के लिए कुछ और बदलाव करने की आवश्यकता होगी।
एल कैपिटन पर एसआईपी ओएस एक्स पर पायथन के ऐप्पल द्वारा आपूर्ति किए गए संस्करण के साथ पाइप का उपयोग करने के साथ तीन समस्याओं को उजागर करता है:
डिस्टिल्स मैक पर दो महत्वपूर्ण चर को सही ढंग से सेट नहीं करता है, इसलिए पाइप हेडर और अन्य साझा की गई फ़ाइलों (जैसे, मैनपेज़) के तहत लिखने की कोशिश करता है /System/Library/Frameworks/Python.framework/Versions/2.7/
। यह एक बुरा विचार है, लेकिन ओएस एक्स के पुराने संस्करणों में, यह सफल रहा कि क्या पाइप को सूडो के साथ चलाया गया था। हालांकि यह एसआईपी के कारण एल कैपिटन पर विफल रहता है। यह वह त्रुटि है जिसे आपने चलाया था। यह जैसे संदेश देता हैOSError: [Errno: 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/share'
Apple कुछ पैकेजों के पुराने संस्करणों को स्थापित करता है /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
(जैसे, छह)। ओएस एक्स के पिछले संस्करणों पर, जब आपने एक पैकेज स्थापित किया था, जिसमें से किसी एक के नए संस्करण की आवश्यकता थी, sudo pip
तो चुपचाप पुराने संस्करण को /System/
फ़ोल्डर से हटा दें और एक नया संस्करण स्थापित करें /Library/Python/2.7/site-packages
। यह भी एक बुरा विचार था, और अब एसआईपी के साथ संभव नहीं है। लेकिन अब पुराने पैकेज को हटाने की कोशिश करते समय एक त्रुटि संदेश के साथ पाइप क्रैश हो जाएगा। वह संदेश भी है OSError: [Errno: 1]
, लेकिन यह एक संदेश की तरह आता है Uninstalling six-1.4.1:
। देखें, उदाहरण के लिए, https://github.com/pypa/pip/issues/3165 ।
पायथन का ऐप्पल संस्करण मानक उपयोगकर्ता-सुलभ पैकेज स्थापना स्थानों के ऊपर/System/Library/Frameworks/Python.framework/Versions/2.7/
अजगर खोज पथ के तहत कई निर्देशिकाओं को जोड़ता है । इसलिए यदि आप एक पैकेज का नया संस्करण कहीं और स्थापित करते हैं (उदाहरण के लिए, ), तो आपको एक संदेश मिलेगा कि स्थापना सफल हुई, लेकिन तब जब आप अजगर चलाते हैं तो आपको पुराने संस्करण से मिलेगा । इससे नए पैकेजों का उपयोग करना भी असंभव हो जाता है जिनका मानक पुस्तकालय से मॉड्यूल के समान नाम है।sudo -H pip install --ignore-installed six
/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
आप इन मुद्दों पर काम कर सकते हैं, लेकिन यह विधि आपके तीन प्रश्नों के उत्तर पर निर्भर करती है।
- क्या आप पायथन के मैक ओएस एक्स संस्करण का उपयोग जारी रखना चाहते हैं या अपना खुद का इंस्टॉल करना चाहते हैं? अपने आप को स्थापित करना सबसे सुरक्षित विकल्प है, और आधिकारिक पायथन इंस्टॉलर, होमब्रे या एनाकोंडा के माध्यम से किया जा सकता है। यह भी वही है जो Apple अनुशंसा करता है , जैसा कि @Sacrilicious ने बताया है । यदि आप अपने स्वयं के संस्करण पायथन को स्थापित करते हैं, तो आपको संभवतः वर्तमान में स्थापित
/Library/Python/2.7/site-packages
किसी भी स्क्रिप्ट को अनइंस्टॉल करना चाहिए और /usr/local/bin
उन पैकेजों (पाइप सहित) के लिए स्थापित की गई कोई भी स्क्रिप्ट । अन्यथा आपको पायथन के सिस्टम-इंस्टॉल किए गए संस्करण तक पहुंचने वाली कुछ लिपियों और कुछ स्वयं की स्थापना तक पहुंचने का कष्टप्रद अनुभव होगा।
यदि आप सिस्टम-स्थापित पायथन के साथ रहना चाहते हैं, तो आपको दो और निर्णय लेने होंगे:
क्या आप सभी उपयोगकर्ताओं के लिए, या सिर्फ अपने लिए पैकेज स्थापित करना चाहते हैं? सभी उपयोगकर्ताओं के लिए इंस्टॉल करना सुनिश्चित करता है कि पायथन (संभवतः प्रशासनिक स्क्रिप्ट सहित) का उपयोग करने वाले प्रत्येक प्रोग्राम में आपके द्वारा इंस्टॉल किए गए सभी पैकेजों तक पहुंच होगी। हालांकि, एक दूर का मौका है कि यह एल कैपिटन के अजगर के खुद के उपयोग में हस्तक्षेप करेगा। (मुझे आशा है कि Apple python -S
यह सुनिश्चित करने के लिए उपयोग करता है कि वे हमेशा उन पैकेजों को प्राप्त करें जिनकी वे अपेक्षा करते हैं, लेकिन मेरे पास इसका परीक्षण करने का कोई तरीका नहीं है।) सिर्फ अपने स्वयं के उपयोगकर्ता खाते के लिए इंस्टॉल करना सिस्टम पायथन इंस्टॉलेशन के साथ हस्तक्षेप करने की संभावना को समाप्त करता है। नोट: यदि आप सिस्टम-वाइड इंस्टॉलेशन से यूजर-ओनली में स्विच करने जा रहे हैं, तो आपको संभवतः इस बात का मौका लेना चाहिए कि वर्तमान में स्थापित /Library/Python/2.7/site-packages
और संबंधित स्क्रिप्ट में कुछ भी अनइंस्टॉल कर दिया जाए /usr/local/bin
।
क्या आप उन अतिरिक्त पैकेजों को छिपाना चाहते हैं जो पायथन के ओएस एक्स संस्करण (अंडर /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/
) के साथ इंस्टॉल किए गए हैं , या उन्हें खोज पथ में रखना है? मैं उन्हें छिपाने की सलाह देता हूं, ताकि जरूरत पड़ने पर इन पैकेजों के नवीनतम संस्करण स्वचालित रूप से उपयोगकर्ता-सुलभ स्थानों में स्थापित हो जाएं। यदि आप इस निर्देशिका को नहीं छिपाते हैं, तो आपको कभी-कभी ऐसे संदेश मिलेंगे कि पाइप एक मौजूदा पैकेज को बाद के संस्करण में अपग्रेड करने के लिए (जिसे आप स्थापित कर रहे हैं एक अलग पैकेज द्वारा आवश्यक) को हटाने में असमर्थ थे। उस स्थिति में, आपको चलाने की आवश्यकता होगी pip install --ignore-installed <package>
, जो नए संस्करण को स्थापित करेगा और सिस्टम-इंस्टॉल किए गए संस्करण को छिपाएगा। हालांकि, अगर आप पूरा छिपाते हैं/System/.../Extras/...
निर्देशिका, आप कुछ ऐप्पल पैकेजों तक पहुंच खो देंगे जो कि पाइप, यानी, कोरग्राफिक्स और बोनजॉर के माध्यम से उपलब्ध नहीं हैं। (यदि आपको इनकी आवश्यकता है, तो आप इन्हें अपनी साइट-संकुल निर्देशिका में समरूपता प्राप्त कर सकते हैं।)
अब, यहाँ workarounds हैं। ऑपरेटिंग सिस्टम द्वारा उपयोग किए जाने वाले पायथन पैकेज को गलती से बदलने या हटाने से बचने के लिए, ओएस एक्स के सभी संस्करणों पर अच्छा अभ्यास होगा; हालाँकि, यदि आप OS X El Capitan (10.11) पर Python के Apple द्वारा प्रदत्त संस्करण के साथ उपयोगकर्ता-संस्थापित संकुल का उपयोग करना चाहते हैं तो वे आवश्यक हैं।
पाइप स्थापित करें
आपने शायद ऐसा पहले ही कर लिया है, लेकिन यदि नहीं, तो आप सभी उपयोगकर्ताओं के लिए पाइप स्थापित करने के लिए निम्न कमांड का उपयोग कर सकते हैं :
sudo -H easy_install pip
# pip script will be installed in /usr/local/bin
या केवल अपने स्वयं के उपयोगकर्ता खाते के लिए पाइप स्थापित करने के लिए इस कमांड का उपयोग करें :
easy_install --user pip
# pip script will be installed in ~/Library/Python/2.7/bin
साझा फ़ाइल स्थान प्रबंधित करें
यदि आप सभी उपयोगकर्ताओं के लिए पैकेज स्थापित कर रहे हैं, तो इन पंक्तियों के साथ .pydistutils.cfg नामक एक फ़ाइल बनाएं ( https://github.com/pypa/pip/issues/426 से ):
[install]
install-data=/usr/local
install-headers=/usr/local
यदि आप आमतौर पर उपयोग करते हैं sudo -H pip ...
, तो आपको यह फ़ाइल /var/root
(रूट उपयोगकर्ता के लिए होम निर्देशिका) में डालनी चाहिए। यदि आप आमतौर पर उपयोग करते हैं sudo pip ...
, तो आपको इस फ़ाइल को अपने घर निर्देशिका (~) में रखना चाहिए।
ये सेटिंग्स पाइप को हेडर और मैनपेज़ जैसे साझा किए गए आइटम को लिखने की कोशिश करने से रोकेंगी /Library/System
। (इस उत्तर के शीर्ष पर स्थित कमांड एक ही चीज़ का एक तेज़ संस्करण है।) इन सेटिंग्स की आवश्यकता है क्योंकि डार्विन-विशिष्ट कोड /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/distutils/command/install.py
इन वेरिएबल्स को रूट-राइट करने योग्य स्थानों पर सेट करने में विफल रहता है (हालांकि यह अन्य चर को सही ढंग से सेट करता है)। इस बारे में https://github.com/pypa/pip/issues/3177 पर अधिक जानकारी है ।
यदि आप केवल अपने स्वयं के उपयोगकर्ता खाते के लिए पैकेज स्थापित करते हैं, तो साझा किए गए आइटम स्वचालित रूप से इंस्टॉल किए जाएंगे ~/Library/Python/2.7/
। लेकिन आपको अपनी ~ / .profile में निम्न पंक्तियों को जोड़ना चाहिए ताकि जब आपको उनकी आवश्यकता हो तो साझा किए गए आइटम मिल जाएंगे:
export PATH=~/Library/Python/2.7/bin:$PATH
export MANPATH=~/Library/Python/2.7/share/man:$MANPATH
नोट: आपको परिवर्तनों को प्रभावी करने के लिए कमांड लाइन पर एक नया शेल शुरू करने या चलाने की आवश्यकता होगी। hash -r
यदि आप हाल ही में पुराने स्क्रिप्ट को रास्ते से हटा चुके हैं, तो आप चलाना चाह सकते हैं ।
अजगर पथ का प्रबंधन करें
आपको यह सुनिश्चित करने की आवश्यकता होगी कि आपके द्वारा इंस्टॉल किए गए पैकेज सिस्टम-स्थापित पैकेजों की तुलना में पायथन के खोज क्रम में अधिक हैं। ऐसा करने का सबसे आसान तरीका .pth
फाइलों के साथ है। यह इस पृष्ठ पर अन्यत्र @ Sacrilicious के सुझाव का अनुसरण करता है, लेकिन यह सुनिश्चित करता है कि आपके सिस्टम-वाइड साइट-पैकेज निर्देशिका से पहले आपके उपयोगकर्ता साइट-संकुल निर्देशिका को खोजा जाता है, और दोनों को मानक पुस्तकालय और Apple के अतिरिक्त निर्देशिका (दोनों के तहत / सिस्टम /) से पहले खोजा जाता है। ..)। /System/.../Extras
यदि वांछित है तो यह खोज पथ से भी दूर है।
fix_mac_path.pth
नीचे दी गई पाठ के साथ नामक एक फ़ाइल बनाएँ । यदि आप सभी उपयोगकर्ताओं के लिए पैकेज स्थापित कर रहे हैं, fix_mac_path.pth
तो इसे रखा जाना चाहिए /Library/Python/2.7/site-packages
। यदि आप केवल अपने स्वयं के उपयोगकर्ता के लिए स्थापित कर रहे हैं, तो fix_mac_path.pth
~ / लाइब्रेरी / पायथन / 2.7 / lib / python / साइट-संकुल में होना चाहिए। (इस फ़ाइल का कोई भी नाम हो सकता है जिसे आप चाहते हैं, लेकिन इसे इन दोनों स्थानों में से एक या दोनों स्थानों पर रखना होगा, और इसे समाप्त करना होगा .pth
; साथ ही, इस फ़ाइल के सभी पाठ एक पंक्ति में होने चाहिए।)
यदि आप Apple में स्थापित संकुल को छिपाना चाहते हैं /System/.../Extras
:
Apple-आपूर्ति किए गए संस्करण से स्वतंत्र पाइप / सेप्टुल्फूल की एक कार्यशील प्रतिलिपि प्राप्त करने के लिए पहले निम्न कमांड में से एक को चलाएं:
pip install --ignore-installed --user setuptools # your account only
# or
sudo -H pip install --ignore-installed setuptools # all users
फिर fix_mac_path.pth
ऊपर दिए गए स्थान पर निम्न कोड डालें:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/') and not '/Extras/' in p]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
यदि आप Apple स्थापित पैकेजों का उपयोग करते रहना चाहते हैं, तो आपको सेटप्टूल की एक और प्रति स्थापित करने की आवश्यकता नहीं है। बस fix_mac_path.pth
ऊपर दिए गए स्थान पर निम्नलिखित कोड डालें:
import sys; std_paths=[p for p in sys.path if p.startswith('/System/')]; sys.path=[p for p in sys.path if not p.startswith('/System/')]+std_paths
इसके बाद, आप python -m site
यह सुनिश्चित करने के लिए उपयोग कर सकते हैं कि पथ खोज क्रम समझ में आता है।
पैकेज स्थापित करें
इसके बाद, आपको निम्नलिखित में से किसी एक कमांड का उपयोग करके नए पैकेज स्थापित करने में सक्षम होना चाहिए।
सभी उपयोगकर्ताओ के लिए:
sudo -H pip install <package>
अपने स्वयं के उपयोगकर्ता के लिए:
pip install --user <package>