क्या यह सुडो के तहत पाइप स्थापित करने के लिए स्वीकार्य और सुरक्षित है?


114

मैंने अपने मैक का उपयोग करना शुरू कर दिया है, उसी तरह से मैं अपने विंडोज पीसी के साथ काम पर करता हूं; हालाँकि, अपने मैक पर मैं लॉग फ़ाइलों या साइट-पैकेजों को लिखते समय बार-बार अनुमति से इनकार कर रहा हूं ।

इसलिए मैंने इसके pip install <package>तहत चलने के बारे में सोचा, sudoलेकिन क्या मैं इसे सिर्फ अपने वर्तमान उपयोगकर्ता खाते के तहत स्थापित करना चाहता हूं, इस पर विचार करते हुए सुडोल का एक सुरक्षित / स्वीकार्य उपयोग है?

उदाहरण मे लॉगबैक I / O त्रुटि से:

Command /usr/bin/python -c "import setuptools;__file__='/Users/markwalker/build/pycrypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/tq/hy1fz_4j27v6rstzzw4vymnr0000gp/T/pip-k6f2FU-record/install-record.txt failed with error code 1 in /Users/markwalker/build/pycrypto
Storing complete log in /Users/markwalker/Library/Logs/pip.log
Traceback (most recent call last):
  File "/usr/local/bin/pip", line 8, in <module>
    load_entry_point('pip==1.1', 'console_scripts', 'pip')()
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/__init__.py", line 116, in main
    return command.main(args[1:], options)
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 141, in main
    log_fp = open_logfile(log_fn, 'w')
  File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 168, in open_logfile
    log_fp = open(filename, mode)
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

अद्यतन यह अनुमतियों के लिए नीचे था, हालांकि सबसे अच्छा तरीका यह है कि आप अपने अजगर परियोजनाओं के लिए आभासी वातावरण का उपयोग करें। sudo pipजब तक बिल्कुल आवश्यक न हो, दौड़ने से बचना चाहिए।


12
मुझे लगता है कि ' cd /tmp; sudo pip install foo' एक पर्याप्त समाधान है।
ब्रायन कैन


@pradyunsg इतना पुराना सवाल क्यों फहराते हैं?
markwalker_

3
संक्षेप में, वर्तमान स्वीकृत उत्तर (और प्रश्न में अपडेट) "सुडो पाइप" को चलाने का सुझाव देता है - ऐसा कुछ जो पाइप के अनुचर (उनमें से एक होने के नाते) सक्रिय रूप से लोगों को ऐसा करने के लिए नहीं कह रहा है जिसके परिणामस्वरूप आपका ऑपरेटिंग सिस्टम टूट सकता है। MacOS और कई (सभी?) प्रमुख लिनक्स वितरण। मैं शर्तों का उपयोग करते हुए यहां उतरा कि कोई व्यक्ति अपनी स्थिति को डिबग कर सकता है और बस इस रीडायरेक्ट लोगों को बेहतर सलाह के साथ किसी स्थान पर बनाना चाहता है। वास्तव में इस सवाल को लाने के बारे में नहीं सोचा था और यह उपरोक्त कथन के अनुरूप बेहतर है। (वर्णों से बाहर)
pradyunsg

@markwalker_ क्या आप प्रश्न से उस सलाह को हटाने के लिए तैयार होंगे और संभवतः इसे या तो बेहतर सलाह के साथ बदल देंगे (--user या virtualenv का उपयोग करके)?
प्रद्युम्नजी

जवाबों:


105

एक आभासी वातावरण का उपयोग करें :

$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

sudoजब आप वैश्विक, सिस्टम-व्यापी पायथन इंस्टॉलेशन के लिए सामान स्थापित करना चाहते हैं, तो आप केवल अनुमतियों का उपयोग या ऊंचा करते हैं।

एक आभासी वातावरण का उपयोग करना सबसे अच्छा है जो आपके लिए पैकेज को अलग करता है। इस तरह से आप वैश्विक अजगर स्थापित प्रदूषण के बिना चारों ओर खेल सकते हैं।

एक बोनस के रूप में, virtualenv को उन्नत अनुमतियों की आवश्यकता नहीं है।


2
अगर उसकी अनुमति को उसके घर निर्देशिका के लिए गड़बड़ कर दिया जाता है , तो virtualenv का उपयोग करने से उसकी मदद करने की संभावना नहीं है
HD1

1
हां, यह होगा, लेकिन यह पहले से ही हुआ है, इसलिए उसे जारी रखने से पहले इसे ठीक करने की आवश्यकता है।
एचडी 1

1
धन्यवाद दोस्तों, मैं virtualenv के बारे में पढ़ा है इससे पहले कि उम्मीद है कि इन दो समाधान एक साथ मुझे पटरी पर मिल जाएगा :)
markwalker_

1
इसके अलावा, virtualenv स्थापित करने के लिए आपको sudo करने की आवश्यकता है ... या क्या कोई वर्कअराउंड है?
jimijazz

8
मुझे समझ नहीं आता कि यह सबसे अच्छा जवाब क्यों है। सवाल आभासी वातावरण के बारे में नहीं है। यह उपयोग करने की वैधता के बारे में है sudo pip install। मान लें कि मुझे कुछ पैकेज स्थापित करने की आवश्यकता है जो मैं कई परियोजनाओं में या सिस्टम स्तर पर उपयोग करूंगा। जैसे कुछ CLI टूल pgcli। जाहिर है मुझे इसके लिए वर्चुअल एनवी की जरूरत नहीं है, मैं इसे विश्व स्तर पर स्थापित करना चाहता हूं। क्या मुझे उपयोग करना चाहिए sudo pip installया कुछ और सही तरीके हैं? यह सवाल है।
एलेक्स बिल्लाएव

42

इसे चलाने के लिए स्वीकार्य और सुरक्षित है pip installके तहत sudo?

यह सुरक्षित नहीं है और इस पर ध्यान केंद्रित किया जा रहा है - देखें कि 'सुडो पाइप' को चलाने के जोखिम क्या हैं? अपने घर की निर्देशिका में पायथन पैकेज स्थापित करने के लिए आपको रूट विशेषाधिकारों की आवश्यकता नहीं है। देखें विवरण के --userपिप करने का विकल्प।


यद्यपि आपका समाधान पहला ऐसा था जो वास्तव में काम करता था, @throws_exception_at_you ने वास्तविक कोड के साथ एक प्रतिक्रिया बनाई और प्रलेखन के लिए पुनर्निर्देशन नहीं
एडेंशॉ

मैं sudo pip installइसका उपयोग करने के नुकसान नहीं जानता था । मैं इस आदेश को पूर्ववत् कैसे कर सकता हूं या इसके तहत चलने के लिए अवरुद्ध कर सकता हूं sudo?
एमरे डिएर्मेंस्की

26

आपकी मूल समस्या यह है कि पाइप फ़ोल्डर में लॉग नहीं लिख सकता है।

IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

आपको एक फोल्डर में cd करने की आवश्यकता होती है, जिसमें लगाई गई प्रक्रिया /tmpऐसा लिख सकती है cd /tmpऔर कमांड को फिर से लागू करना शायद काम करेगा लेकिन ऐसा नहीं है जो आप चाहते हैं।

लेकिन वास्तव में इस विशेष मामले के लिए (आप sudoअजगर पैकेज स्थापित करने के लिए उपयोग नहीं करना चाहते हैं) और वैश्विक पैकेज इंस्टॉल की कोई आवश्यकता नहीं है आप --userइस तरह से ध्वज का उपयोग कर सकते हैं :

pip install --user <packagename>

और यह ठीक काम करेगा।

मुझे लगता है कि आपके पास एक उपयोगकर्ता अजगर अजगर स्थापना है और virtualenv (जो बहुत userfriendly नहीं है) या pipenv के बारे में पढ़ने के साथ परेशान नहीं करना चाहता ।

जैसा कि टिप्पणी अनुभाग में कुछ लोगों ने बताया है कि अगला दृष्टिकोण बहुत अच्छा विचार नहीं है जब तक कि आप नहीं जानते कि क्या करना है और अटक गया:

वैश्विक पैकेज के लिए एक और दृष्टिकोण जैसे आपके मामले में आप कुछ करना चाहते हैं:

chown -R $USER /Library/Python/2.7/site-packages/

या अधिक आम तौर पर

chown -R $USER <path to your global pip packages>

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

1
मैं यहाँ एक तर्क नहीं देखता। इस तथ्य को भी देखते हुए कि कोई व्यक्ति जो इस तरह के प्रवेश स्तर का प्रश्न पूछता है, वह शायद यूनिक्स की अनुमति प्रणाली से परिचित नहीं है और इसलिए 1-उपयोगकर्ता को चलाने से कोई फर्क नहीं पड़ता। इसके अलावा आपका जवाब वास्तव में मेरे लिए उपयोग के मामले को संबोधित करने में विफल रहता है। ऐसा करने के बाद मैं आसानी से पूर्व-इंस्टॉल करने के लिए अनुमतियों को वापस कर सकता हूं।
throws_exception_at_you

2
+1 वास्तव में पूरे कमांड लिखने के लिए । कुछ लोगों का मानना ​​है कि ओपी जानता है कि कमांड लाइन पर एक विकल्प को कैसे लागू किया जाए , जब वे या अन्य पाठक, नहीं कर सकते हैं। क्या आप सहमत नहीं हैं, @PiotrDobrogost?
आइए मैं इसके बारे में

जोड़ने से --userमुझे मदद मिलती है!
Honghao Zhang

2
सिस्टम के लिए अनुमतियों को बदलना पायथन की पूरी site-packagesनिर्देशिका एक रिंच के साथ उस पर whacking करके "फिक्सिंग" एक पंप के समान है। यह एक कारण से संरक्षित है - आप वहां सामान स्थापित करने वाले नहीं हैंवास्तविक समाधान दिन-प्रतिदिन की प्रोग्रामिंग के साथ प्रणाली अजगर वितरण मिश्रण नहीं है। एक अलग पायथन वितरण स्थापित करें (Python.org, Homebrew, चंदवा, आदि से)।
charlesreid1

9

क्योंकि मुझे भी यही समस्या थी, इसलिए मैं इस बात पर ज़ोर देना चाहता हूं कि वास्तव में ब्रायन कैन की पहली टिप्पणी "IOError: [Errno 13]" का हल है - समस्या:

यदि अस्थायी निर्देशिका ( cd /tmp) में निष्पादित किया जाता है , तो IOError तब नहीं होता है जब मैं चलता हूं sudo pip install foo


2
कोई भी मौका आप समझा सकते हैं कि यह आपके लिए समस्या क्यों हल करता है?
क्रिस

8
आप अभी भी sudo pipइस "समाधान" के साथ उपयोग कर रहे हैं और इस प्रकार रूट विशेषाधिकारों के साथ पैकेज स्थापित कर रहे हैं , जो कि शायद आप क्या चाहते हैं?
क्रिस

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

उसके पास '
/User/markwalker/Library/Logs/pip.log

5

मुझे virtualenvwrapperसफलतापूर्वक स्थापित करने के बाद स्थापित करने में समस्या थी virtualenv

मैंने ऐसा करने के बाद अपने टर्मिनल की शिकायत की:

pip install virtualenvwrapper

इसलिए, मैंने असफल रूप से यह कोशिश की (नहीं लिखा है) :

sudo pip install virtualenvwrapper

फिर, मैंने इसे सफलतापूर्वक इसके साथ स्थापित किया:

pip install --user virtualenvwrapper

पाइप के लिए - ऑसर विकल्प को मेरे उत्तर में एक समाधान के रूप में दिया गया था जो आपके लिखे जाने पर पहले से मौजूद था। यह एक टिप्पणी होना चाहिए था एक जवाब नहीं।
पायोत्र डोब्रोगोस्ट

आप कहते हैं कि अनुशंसित नहीं है, लेकिन आधिकारिक स्थापना नोट्स सुडो के साथ virtualenvwrapper स्थापित करने के लिए ठीक कहते हैं। Virtualenv के लिए एक ही जाता है। यहां पूछे गए प्रश्न उन दो का कोई संदर्भ नहीं देते हैं, इसलिए मुझे लगता है कि यहां अन्य सभी उत्तर सामान्य अजगर पैकेज के लिए हैं।
mehmet 15

भविष्य के पाठकों के लिए, मैंने उपरोक्त टिप्पणी के कारण मेरे उत्तर में मेरे "अनुशंसित नहीं" ध्वज के माध्यम से मारा लेकिन मैंने अभी तक इसे सत्यापित नहीं किया है। इसलिए मैंने अब तक झंडे को नहीं हटाया।
आइए मैं इसके बारे में

4

ऐसा लगता है कि आपकी अनुमतियां गड़बड़ हैं। chown -R markwalker ~टर्मिनल में टाइप करें और pipफिर से कोशिश करें? मुझे पता है अगर आप हल कर रहे हैं।


यद्यपि यह अनुमतियों की समस्या को हल कर सकता है, यह प्रश्न का उत्तर नहीं देता है।
बुरहान खालिद

1
समस्याओं का समाधान मुझे पता नहीं था कि मेरे पास एक बोनस है! जैसे बहुत से छिपे हुए डायर पर chownदे रहा है और मुझे लगता है कि यह फाइलों के माध्यम से काम कर रहा है जो इसे अब सेट कर सकता है, लेकिन मैं देखता हूं कि जब क्लिंट शीघ्र रिटर्न देता है तो क्या होता है। Operation not permitted.shsh
markwalker_
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.