पाइथन पैकेज को संभालने के लिए पिप बनाम पैकेज मैनेजर


20

पायथन पैकेज को अक्सर कई वितरण के रिपॉजिटरी में होस्ट किया जाता है। इस ट्यूटोरियल को पढ़ने के बाद , विशेष रूप से शीर्षक वाला खंड "क्या आप वास्तव में ऐसा करना चाहते हैं" मैंने पाइप का उपयोग करने से परहेज किया है और सिस्टम रिपॉजिटरी का उपयोग करना पसंद किया है, केवल पाइप का सहारा लेना जब मुझे रिपॉजिटरी में पैकेज स्थापित करने की आवश्यकता होती है।

हालांकि, क्योंकि यह एक असंगत स्थापना विधि है, क्या केवल पाइप का उपयोग करना बेहतर होगा? दोनों स्थानों पर उपलब्ध पैकेजों के लिए सिस्टम के स्वयं के भंडार पर पाइप का उपयोग करने के लिए क्या लाभ / अवरोधक हैं?

लिंक मैं राज्यों शामिल थे

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

मैं आर्च का उपयोग करता हूं। क्या यह उपयुक्त के अलावा अन्य पैकेज-प्रबंधन प्रणालियों के मामले में है?

जवाबों:


21

pipआपके सिस्टम पर पायथन मॉड्यूल या सिस्टम मॉड्यूल या उपयोगकर्ता मॉड्यूल के रूप में स्थापित करने का उपयोग करने के साथ मुझे जो सबसे बड़ा नुकसान होता है, वह यह है कि आपके वितरण के पैकेज प्रबंधन सिस्टम को उनके बारे में पता नहीं चलेगा। इसका मतलब यह है कि उनका उपयोग किसी भी अन्य पैकेज के लिए नहीं किया जाएगा जिसकी उन्हें आवश्यकता है, और जिसे आप भविष्य में स्थापित करना चाहते हैं (या जो अपग्रेड के बाद उन मॉड्यूलों में से एक का उपयोग करना शुरू कर सकते हैं); फिर आप pipमॉड्यूल के दोनों - और वितरण-प्रबंधित संस्करणों के साथ समाप्त हो जाएंगे , जो मुद्दों का कारण बन सकते हैं (मैं हाल ही में इस के एक और उदाहरण में भाग गया )। तो आपका प्रश्न एक ऑल-एंड-नथिंग प्रपोजल होने के नाते समाप्त होता है: यदि आप केवल उपयोग करते हैंpip पायथन मॉड्यूल के लिए, आप अब अपने वितरण के पैकेज प्रबंधक का उपयोग उस चीज के लिए नहीं कर सकते हैं जो पायथन मॉड्यूल का उपयोग करना चाहती है ...

आपके द्वारा लिंक किए गए पृष्ठ में दी गई सामान्य सलाह बहुत अच्छी है: जहां तक ​​संभव हो, अपने वितरण के पैकेजों का उपयोग करने का प्रयास करें, केवल उन pipमॉड्यूल का उपयोग करें जो पैक नहीं किए गए हैं, और जब आप ऐसा करते हैं, तो अपने उपयोगकर्ता सेटअप में ऐसा करें और सिस्टम नहीं- विस्तृत। जहां तक ​​संभव हो आभासी वातावरण का उपयोग करें, विशेष रूप से मॉड्यूल विकास के लिए। विशेष रूप से आर्क पर, आपको पुराने मॉड्यूल के कारण होने वाले मुद्दों में नहीं चलना चाहिए; यहां तक ​​कि वितरण पर जहां यह एक समस्या हो सकती है, आभासी वातावरण इसके साथ काफी आसानी से निपटते हैं।

यह हमेशा ध्यान देने योग्य है कि वितरण के पुस्तकालय और मॉड्यूल पैकेज मुख्य रूप से वितरण में अन्य पैकेजों के उपयोग के लिए पैक किए जाते हैं; उन पुस्तकालयों और मॉड्यूल का उपयोग करके विकास के लिए एक अच्छा दुष्प्रभाव है, लेकिन यह प्राथमिक उपयोग का मामला नहीं है।


1
तथ्य यह है कि हम इस द्वंद्ववाद या विरोधाभास के साथ फंस गए हैं वास्तव में दुर्भाग्यपूर्ण है, शायद हमें पायथन और आधिकारिक प्रतिनिधि में इसे हल करने पर काम करना चाहिए
बिल्ली

जोखिम का उपयोग न करने के साथ मैं देख रहा हूं pipकि क्या होगा यदि आप गलती से pip uninstallएक डिस्ट्रो-प्रबंधित पैकेज है?
मेहरदाद

@ मेहरदाद अधिकांश मामलों में आप pipउपयोगकर्ता (virtualenv के साथ संयोजन के रूप में) के रूप में चलाएंगे , और जैसे कि आपको सिस्टम-स्थापित फ़ाइलों के साथ गड़बड़ करने की अनुमति नहीं है।
मार्सेल

1
@marcelm: मुझे लगता है कि यदि आप एक लिनक्स मशीन हैं और किसी ने आपको उपयोग नहीं करना सिखाया है, sudo pipतो हो सकता है (हालांकि तब भी, आप बहुत अधिक उपयोग कर रहे हैं, जब आप मानते हैं कि हर कोई उपयोग करता है virtualenv), लेकिन उदाहरण के लिए मैं MSYS2 (Windows) का उपयोग करता हूं जहाँ बस लागू नहीं होता है। मेरे पास अजगर पैकेज स्थापित करने के लिए दो विकल्प हैं: pacmanऔर pip। मुझे यह ध्यान रखना होगा कि जो स्थापित करने के लिए उपयोग किया जाता है क्योंकि गलत की स्थापना रद्द करने के लिए गलत चीजों का उपयोग करने से चीजें खराब हो जाएंगी।
मेहरदाद

10

टी एल; डॉ

  • उपयोग pip(+ virtualenv) सामान के लिए (libs, चौखटे, शायद देव उपकरण) आपकी परियोजनाएं (जो आप विकसित करते हैं) उपयोग करते हैं
  • अनुप्रयोगों के लिए पैकेज मैनेजर उपयोग आप (एक अंतिम-उपयोगकर्ता के रूप में) का उपयोग करें

विकास पर निर्भरता

यदि आप पायथन में सॉफ़्टवेयर विकसित कर रहे हैं, तो आप pipप्रोजेक्ट की सभी निर्भरताओं के लिए उपयोग करना चाहेंगे , वे रनटाइम निर्भरताएँ, बिल्ड-टाइम निर्भरताएँ या स्वचालित परीक्षण और स्वचालित अनुपालन जाँच के लिए आवश्यक सामान (लिंटर, स्टाइल चेकर, स्टैटिक प्रकार चेकर) ...)

इसके अनेक कारण हैं:

  • यह आपको virtualenv (या तो सीधे या virtualenvwrapper या pipenv या अन्य साधनों के माध्यम से) का उपयोग करने की अनुमति देता है , एक-दूसरे से अलग-अलग परियोजनाओं की निर्भरता और आपके द्वारा "उत्पादन में" उपयोग किए जाने वाले अजगर अनुप्रयोगों को अलग करने के लिए (किसी उपयोगकर्ता के रूप में किसी भी विदेशी शेंनिगन से) यहां तक ​​कि सिर्फ असंगतताएं) जो विकास में आगे बढ़ सकती हैं।
  • यह आपको किसी परियोजना की निर्भरता के सभी को ट्रैक करने की अनुमति देता है requirements.txt(यदि आपकी परियोजना एक आवेदन है) या setup.py(यदि आपकी परियोजना एक पुस्तकालय या रूपरेखा है) फ़ाइल। इसे सोर्स कोड के साथ एक साथ रिवीजन कंट्रोल (जैसे Git) में चेक किया जा सकता है, ताकि आपको हमेशा पता रहे कि आपके कोड के कौन से वर्जन पर निर्भरता के कौन से वर्जन पर निर्भर है।
  • उपर्युक्त अन्य डेवलपर्स को आपकी परियोजना पर सहयोग करने में सक्षम बनाता है, भले ही वे एक ही लिनक्स वितरण का उपयोग न करें या एक ही ऑपरेटिंग सिस्टम (यदि उपयोग की गई निर्भरताएं मैक और विंडोज पर भी उपलब्ध हैं या वे जो भी उपयोग करने के लिए होते हैं, वह है)
  • आप अपने कोड को तोड़ने के लिए अपने ऑपरेटिंग सिस्टम के पैकेज मैनेजर के स्वचालित अपडेट नहीं चाहते हैं। आपको अपनी निर्भरता को अपडेट करना चाहिए, लेकिन आपको ऐसा जानबूझकर और कई बार आपके द्वारा चुने जाने पर करना चाहिए, ताकि आप अपने कोड को ठीक करने के लिए तैयार रहें या अपडेट को वापस ले सकें। (यदि आप अपने कोड के साथ, अपने नियंत्रण प्रणाली में पूर्ण निर्भरता घोषणा को ट्रैक करते हैं तो यह आसान है।)

यदि आपको लगता है कि आपको प्रत्यक्ष और अप्रत्यक्ष निर्भरता को अलग करने की आवश्यकता है (या इस्तेमाल की गई निर्भरता और वास्तविक संस्करण के लिए स्वीकार्य संस्करण सीमा के बीच अंतर करें, तो cf. "संस्करण पिनिंग") पाइप-टूल्स और / या पिपेनव में देखें। यह आपको निर्माण और परीक्षण निर्भरता के बीच अंतर करने की भी अनुमति देगा। (बिल्ड और रनटाइम निर्भरता के बीच का अंतर शायद इनकोड किया जा सकता है setup.py)

आपके द्वारा उपयोग किए जाने वाले एप्लिकेशन

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

यदि आपको किसी चीज़ की ज़रूरत नहीं है जो आपके वितरण के डिफ़ॉल्ट पैकेज रेपो में उपलब्ध नहीं है, तो आप अतिरिक्त पैकेज रेपो (जैसे डिबेट-आधारित डिस्ट्रोस के लॉन्चपैड) की जांच कर सकते हैं या pipवैसे भी उपयोग कर सकते हैं । यदि बाद वाला, --userसिस्टम-वाइड के बजाय अपने उपयोगकर्ता के घर में स्थापित करने के लिए उपयोग करता है, ताकि आपके पायथन इंस्टॉलेशन को तोड़ने की संभावना कम हो। (सामान के लिए आपको केवल अस्थायी रूप से या शायद ही कभी आवश्यकता होती है, आप एक virtualenv का उपयोग भी कर सकते हैं।)


8

पैकेज मैनेजर के साथ जाने का एक और कारण यह है कि अपडेट स्वचालित रूप से लागू किया जाएगा जो सुरक्षा के लिए महत्वपूर्ण है। सोचें कि अगर सेम पैकेज इक्विफैक्स का उपयोग स्वचालित रूप से यम-क्रोन-सुरक्षा के माध्यम से अपडेट किया गया था, तो हैक नहीं हुआ हो सकता है।

मेरे व्यक्तिगत देव बॉक्स पर मैं पिप का उपयोग करता हूं, ठेस में मैं पैकेज का उपयोग करता हूं।


4
जो आप उपयोग करते हैं, वह आपके उत्पादन सेट पर भी निर्भर करता है। Virtualenvs कारण के लिए मौजूद हैं :) इसके अलावा, आपके डिस्ट्रो के आधार पर, सुरक्षा अपडेट वास्तव में पाइप के बजाय छड़ी करने का एक कारण हो सकता है, क्योंकि पैकेज प्रबंधक नए संस्करणों को जोड़ने के लिए धीमा हो सकता है।
एडवर्ड मिनिक्स

7

यदि हम कोड लिखने के लिए अजगर पैकेज स्थापित करने के बारे में बात कर रहे हैं, तो आप पाइप का उपयोग करें।

आप जिस प्रोजेक्ट पर काम कर रहे हैं, उसके लिए एक वर्चुअल वातावरण बनाएं और फिर उस प्रोजेक्ट को स्थापित करने के लिए केवल पाइप का उपयोग करें। इस तरह, आप उन सभी पुस्तकालयों को स्थापित करते हैं जो आप एक सुसंगत तरीके से उपयोग करते हैं, और वे निहित हैं और आपके पैकेज प्रबंधक के माध्यम से आपके द्वारा स्थापित किसी भी चीज़ में हस्तक्षेप नहीं करते हैं।

आप कर रहे हैं की योजना बना किसी भी अजगर कोड जारी करने के लिए हैं, तो आम तौर पर, आप एक जोड़ देंगे setup.pyया requirements.txtअपनी परियोजना है, जो पिप स्वचालित रूप से सभी यह निर्भरता प्राप्त करने की अनुमति देगा करने के लिए। आपको उस प्रोजेक्ट के लिए वर्चुअल वातावरण बनाने या बनाने के लिए अनुमति देता है।


1

सारांश

आपके साथ काम कर रहे मॉड्यूल की तीन सामान्य श्रेणियां हैं:

  1. ओएस पैकेज सिस्टम वाले सभी उपयोगकर्ताओं के लिए स्थापित सहायक प्रोग्राम। (इसमें पायथन में प्रोग्रामिंग करने वाले लोगों द्वारा उपयोग किए जाने वाले टूल और लाइब्रेरी भी शामिल हो सकते हैं; नीचे देखें।) इनके लिए आप उन OS पैकेजों का उपयोग करते हैं जहाँ आप कर सकते हैं, और pipजहाँ आवश्यक हो, सिस्टम निर्देशिकाओं में इंस्टॉल हो जाता है।
  2. एक विशेष उपयोगकर्ता द्वारा केवल अपने उपयोग के लिए स्थापित कार्यक्रमों का समर्थन करने वाले, और स्क्रिप्टिंग भाषा के रूप में पायथन के "दिन-प्रतिदिन" उपयोग के कुछ पहलुओं के लिए भी। इन के लिए वह उपयोग करती है pip --user, शायद pyenv या pythonz , और इसी तरह के उपकरण और रणनीति।
  3. एक विशिष्ट अनुप्रयोग के विकास और उपयोग का समर्थन करने वाले। इनके लिए आप virtualenv(या एक समान उपकरण) का उपयोग करें।

यहां प्रत्येक स्तर को पिछले स्तर से भी समर्थन मिल सकता है। उदाहरण के लिए, हमारा उपयोगकर्ता (2) OS संकुल के माध्यम से स्थापित पायथन इंटरप्रेटर पर निर्भर हो सकता है।

इसे थोड़ा और विस्तार से जाना:

सिस्टम प्रोग्राम और पैकेज

पायथन में लिखे गए प्रोग्राम जिन्हें आप "बस चलाना चाहते हैं" आसान हैं: बस ओएस इंस्टॉल टूल का उपयोग करें और उन्हें जो कुछ भी ज़रूरत है उसे लाने दें; यह एक गैर-पायथन कार्यक्रम से अलग नहीं है। यह पायथन टूल्स / लाइब्रेरीज़ (जैसे कि पायथन इंटरप्रेटर खुद!) में लाने की संभावना है कि आपकी मशीन पर उपयोगकर्ता भरोसा करना शुरू कर सकते हैं; यह तब तक समस्या नहीं है जब तक वे निर्भरता को समझते हैं और, आदर्श रूप से, मेजबान पर इसे संभालने के लिए वैकल्पिक साधनों को जानते हैं जो उन निर्भरताओं को प्रदान नहीं करते हैं।

इस तरह की निर्भरता का एक सामान्य और सरल उदाहरण मेरी व्यक्तिगत स्क्रिप्ट में से कुछ है, ~/.local/bin/जिसके साथ शुरू होता है #!/usr/bin/env python। ये आरएच / सेंटोस 7 पर ठीक काम करेंगे (इसलिए जब तक वे पायथन 2 के तहत चलते हैं) और सबसे (लेकिन सभी नहीं) उबंटू स्थापित करता है; वे एक मूल डेबियन इंस्टॉल या विंडोज पर नहीं करेंगे। जितना मैं अपने निजी वातावरण को ओएस पैकेजों पर निर्भरता के तरीके से नापसंद करता हूं (मैं कई अलग-अलग ओएस पर काम करता हूं), ऐसा कुछ मुझे काफी स्वीकार्य लगता है; दुर्लभ मेजबानों पर मेरी बैकअप योजना में एक सिस्टम पायथन नहीं है और एक को प्राप्त नहीं हो सकता है जैसा कि नीचे वर्णित उपयोगकर्ता प्रणाली के साथ जाना है।

एक प्रणाली अजगर दुभाषिया का उपयोग करने वाले लोग भी आमतौर पर प्रणाली पर निर्भर होते हैं pip3। इस बारे में जहां मैं आमतौर पर अपने सिस्टम की निर्भरता पर रेखा खींचता हूं; virtualenvआगे से सब कुछ मैं अपने आप से निपटता हूं। (उदाहरण के लिए, मेरा मानक सक्रिय स्क्रिप्ट पथ में जो कुछ भी है pip3या उस पर निर्भर करता pipहै, लेकिन virtualenvवर्चुअल वातावरण बनाते समय बूटस्ट्रैप की अपनी प्रति डाउनलोड करता है ।

उस ने कहा, संभवत: ऐसी परिस्थितियां हैं जहां विकास के वातावरण को अधिक उपलब्ध कराना पूरी तरह से उचित है। आपके पास जटिल पैकेज (जैसे DBMS) में पाइथन इंटरफेस हो सकता है, जहाँ आप उस के सिस्टम संस्करण का उपयोग करना चाहते हैं और आपको लगता है कि यह सबसे अच्छा है कि आप सिस्टम को उस विशेष लायब्रेरी लाइब्रेरी कोड का चयन करने दें जिससे आप उससे बात करेंगे। या आप पायथन वर्ग के लिए एक बुनियादी विकास के वातावरण के साथ बहुत सारे मेजबानों को तैनात कर सकते हैं, और मानक तकनीकी पैकेजों के साथ स्वचालित करना सबसे आसान पाते हैं।

उपयोगकर्ता "दिन-प्रतिदिन" कार्यक्रम और पैकेज

उपयोगकर्ताओं के पास लाइब्रेरी या प्रोग्राम हो सकते हैं जो एक आभासी वातावरण में अच्छी तरह से फिट नहीं होते हैं क्योंकि वे पहली जगह में आभासी वातावरण बनाने में मदद करना चाहते हैं (जैसे, virtualenvwrapper ) या वे चीजें हैं जो आप आमतौर पर कमांड लाइन से भी उपयोग करते हैं गैर-पायथन काम कर रहा है। यहां तक ​​कि अगर वे इनमें से सिस्टम संस्करण स्थापित करने की क्षमता रखते हैं, तो वे स्वयं को स्थापित करने में अधिक सहज महसूस कर सकते हैं (जैसे, क्योंकि वे उपकरण के नवीनतम संस्करण और इसकी निर्भरता का उपयोग करना चाहते हैं)।

आम तौर पर pip --userलोग इसके लिए उपयोग कर रहे होंगे, हालांकि कुछ निर्भरताएं, जैसे कि पायथन इंटरप्रेटर, इसके लिए थोड़ी अधिक आवश्यकता होती है। pyenv और pythonz व्यक्तिगत दुभाषियों के निर्माण के लिए उपयोगी होते हैं (चाहे ~/.local/binडिफॉल्ट दुभाषिया या अन्यथा स्थापित हो), और निश्चित रूप से एक हमेशा स्रोत से "हाथ से" निर्माण कर सकते हैं यदि देव पुस्तकालय उपलब्ध हैं।

मैं यहां स्थापित नंगे न्यूनतम चीजों को रखने की कोशिश करता हूं: virtualenvwrapper (क्योंकि मैं इसे लगातार उपयोग करता हूं) और शायद पाइप का नवीनतम संस्करण। मैं व्यक्तिगत लाइब्रेरी के लिए मानक पुस्तकालय के बाहर या पायथन 3 पर निर्भरता से बचने की कोशिश करता हूं, जिसे मैं कई मेजबानों में उपयोग करने के लिए लिखता हूं। (हालांकि हम देखेंगे कि जब तक मैं इन व्यक्तिगत लिपियों को पायथन में ले जाऊंगा, तब तक मैं इसे पकड़ सकता हूं।)

अलग अनुप्रयोग विकास और रनटाइम वातावरण

यह सामान्य virtualenv बात है। विकास के लिए आपको लगभग हमेशा एक वर्चुअलेनव का उपयोग करना चाहिए ताकि यह सुनिश्चित हो सके कि आप सिस्टम निर्भरता का उपयोग नहीं कर रहे हैं, या अक्सर विभिन्न पायथन संस्करणों के खिलाफ परीक्षण करने के लिए एक से अधिक हैं।

ये वर्चुअल वातावरण बहुत अधिक निर्भरता वाले अनुप्रयोगों के लिए भी अच्छे हैं जहाँ आप अपने उपयोगकर्ता वातावरण को प्रदूषित करने से बचना चाहते हैं। उदाहरण के लिए, मैं आमतौर पर जुपिटर नोटबुक और जैसे चलाने के लिए एक virtualenv सेट करता हूं ।

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