เป็นที่ยอมรับและปลอดภัยในการรันการติดตั้ง pip ภายใต้ sudo หรือไม่


115

ฉันเริ่มใช้ Mac เพื่อติดตั้งแพ็คเกจ Python ในแบบเดียวกับที่ทำกับ Windows PC ในที่ทำงาน อย่างไรก็ตามใน Mac ของฉันฉันพบข้อผิดพลาดที่ถูกปฏิเสธการอนุญาตบ่อยครั้งขณะเขียนลงในไฟล์บันทึกหรือแพ็คเกจไซต์

ดังนั้นฉันจึงคิดที่จะทำงานpip install <package>ภายใต้sudoแต่การใช้ 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'

อัปเดต สิ่งนี้น่าจะเป็นไปตามสิทธิ์อย่างไรก็ตามแนวทางที่ดีที่สุดคือการใช้สภาพแวดล้อมเสมือนสำหรับโครงการ python ของคุณ sudo pipควรหลีกเลี่ยงการวิ่งเว้นแต่จำเป็นจริงๆ


12
ฉันพบว่า ' cd /tmp; sudo pip install foo' เป็นวิธีแก้ปัญหาที่เพียงพอ
Brian Cain


@pradyunsg ทำไมตั้งค่าสถานะคำถามเก่า ๆ แบบนี้?
markwalker_

3
โดยพื้นฐานแล้วคำตอบที่ได้รับการยอมรับในปัจจุบัน (และอัปเดตในคำถาม) แนะนำให้เรียกใช้ "sudo pip" ซึ่งเป็นสิ่งที่ผู้ดูแลระบบ pip (ตัวเองเป็นหนึ่งในนั้น) กำลังบอกให้ผู้อื่นอย่าทำเพราะอาจส่งผลให้ระบบปฏิบัติการของคุณเสียหายได้ บน MacOS และลีนุกซ์รุ่นใหญ่ ๆ (ทั้งหมด?) ฉันมาที่นี่ในขณะที่ใช้คำที่มีคนแก้ไขสถานการณ์ของพวกเขาและเพียงแค่ต้องการให้คนนี้เปลี่ยนเส้นทางไปยังสถานที่พร้อมคำแนะนำที่ดีกว่า ไม่ได้คิดที่จะนำคำถามนี้มาถามจริง ๆ และมันก็ตอบได้ดีกว่าตามข้อความข้างต้น (ไม่อยู่ในตัวอักษร)
pradyunsg

@markwalker_ คุณยินดีที่จะลบคำแนะนำนั้นออกจากคำถามและอาจแทนที่ด้วยคำแนะนำที่ดีกว่า (โดยใช้ --user หรือ Virtualenv)
pradyunsg

คำตอบ:


105

ใช้สภาพแวดล้อมเสมือน :

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

คุณใช้sudoหรือยกระดับสิทธิ์เฉพาะเมื่อคุณต้องการติดตั้งสิ่งต่างๆสำหรับการติดตั้ง Python ทั่วโลกทั้งระบบ

ที่ดีที่สุดคือใช้สภาพแวดล้อมเสมือนที่แยกแพ็กเกจสำหรับคุณ ด้วยวิธีนี้คุณสามารถเล่นได้โดยไม่ทำให้เกิดมลพิษจากการติดตั้ง python ทั่วโลก

ในฐานะโบนัส Virtualenv ไม่ต้องการการอนุญาตที่สูงขึ้น


2
หากสิทธิ์ของเขายุ่งกับโฮมไดเร็กทอรีของเขาการใช้ Virtualenv ก็ไม่น่าจะช่วยเขาได้
hd1

1
ใช่มันจะเกิดขึ้นแล้วดังนั้นเขาจึงต้องแก้ไขก่อนที่จะดำเนินการต่อ
hd1

1
ขอบคุณครับฉันเคยอ่านเกี่ยวกับ Virtualenv มาก่อนดังนั้นหวังว่าวิธีแก้ปัญหาทั้งสองนี้ร่วมกันจะทำให้ฉันกลับมาทำงานได้ :)
markwalker_

1
นอกจากนี้สำหรับการติดตั้ง Virtualenv คุณต้อง sudo ... หรือมีวิธีแก้ปัญหาหรือไม่?
jimijazz

8
ฉันไม่เข้าใจว่าทำไมถึงเป็นคำตอบที่ดีที่สุด คำถามไม่เกี่ยวกับสภาพแวดล้อมเสมือนจริง sudo pip installมันเป็นเรื่องของความถูกต้องของการใช้ สมมติว่าฉันต้องติดตั้งแพ็คเกจที่ฉันจะใช้ในหลาย ๆ โปรเจ็กต์หรือในระดับระบบ เช่นเครื่องมือ CLI บางอย่างเช่นpgcli. เห็นได้ชัดว่าฉันไม่ต้องการ virtual env สำหรับมันฉันต้องการติดตั้งทั่วโลก ควรใช้sudo pip installหรือมีแนวทางปฏิบัติที่ถูกต้องมากกว่านี้หรือไม่? นั่นคือคำถาม.
Alex Belyaev

42

ก็เป็นที่ยอมรับและความปลอดภัยในการทำงานpip installภายใต้sudo?

มันไม่ปลอดภัยและกำลังถูกขมวดคิ้ว - ดูอะไรคือความเสี่ยงในการเรียกใช้ 'sudo pip'? ในการติดตั้งแพ็คเกจ Python ในโฮมไดเร็กทอรีของคุณคุณไม่จำเป็นต้องมีสิทธิ์รูท ดูคำอธิบายของ--userตัวเลือกในการ pip


แม้ว่าโซลูชันของคุณจะเป็นวิธีแรกที่ใช้งานได้จริง แต่@throws_exceptions_at_you ได้สร้างการตอบกลับด้วยรหัสจริงไม่ใช่การเปลี่ยนเส้นทางไปยังเอกสาร
Edenshaw

ฉันsudo pip installไม่ทราบความเสียหายจากการใช้งาน ฉันจะยกเลิกคำสั่งหรือการบล็อกนี้เพื่อทำงานภายใต้ได้sudoอย่างไร
Emre Değirmenci

26

ปัญหาเดิมของคุณคือ pip ไม่สามารถเขียนบันทึกลงในโฟลเดอร์ได้

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

คุณต้อง cd ลงในโฟลเดอร์ที่กระบวนการเรียกใช้สามารถเขียนได้เช่น/tmpนั้นcd /tmpและการเรียกใช้คำสั่งอีกครั้งอาจจะใช้งานได้ แต่ไม่ใช่สิ่งที่คุณต้องการ

แต่สำหรับกรณีนี้โดยเฉพาะ (คุณไม่ต้องการใช้sudoสำหรับการติดตั้งแพ็คเกจ python) และไม่จำเป็นต้องติดตั้งแพ็คเกจส่วนกลางคุณสามารถใช้--userแฟล็กเช่นนี้:

pip install --user <packagename>

และมันจะทำงานได้ดี

ผมถือว่าคุณมีการติดตั้งผู้ใช้คนหนึ่งหลามงูหลามและไม่ต้องการที่จะรำคาญกับการอ่านเกี่ยวกับvirtualenv (ซึ่งไม่มากใช้งานง่าย) หรือpipenv

เนื่องจากบางคนในส่วนความคิดเห็นได้ชี้ให้เห็นว่าแนวทางถัดไปไม่ใช่ความคิดที่ดีมากเว้นแต่คุณจะไม่รู้ว่าต้องทำอย่างไรและติดขัด:

อีกแนวทางหนึ่งสำหรับแพ็คเกจทั่วโลกเช่นในกรณีของคุณคุณต้องการทำสิ่งต่างๆเช่น:

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

หรือมากกว่าโดยทั่วไป

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

9
-1 การเปลี่ยนความเป็นเจ้าของโฟลเดอร์global site-packageเป็นสิ่งที่ต้องทำอย่างยิ่ง --userตัวเลือกสำหรับการ pip ได้รับเป็นวิธีการแก้ปัญหาในคำตอบของฉันที่มีอยู่แล้วในขณะที่คุณเขียนกับคุณ
Piotr Dobrogost

1
ฉันไม่เห็นข้อโต้แย้งที่นี่ นอกจากนี้ยังได้รับความจริงที่ว่าผู้ที่ถามคำถามระดับรายการดังกล่าวอาจไม่คุ้นเคยกับระบบอนุญาตของยูนิกซ์ดังนั้นจึงเรียกใช้การติดตั้งแบบ 1 ผู้ใช้จึงไม่สำคัญ นอกจากนี้คำตอบของคุณยังไม่สามารถระบุกรณีการใช้งานของฉันที่ต้องการติดตั้งลงในแพ็คเกจส่วนกลาง หลังจากทำเช่นนั้นฉันสามารถคืนสิทธิ์กลับไปที่การติดตั้งล่วงหน้าได้อย่างง่ายดาย
throws_exceptions_at_you

2
+1 สำหรับการเขียนคำสั่งทั้งหมดจริงๆ บางคนคิดว่า OP รู้วิธีใช้ตัวเลือกที่บรรทัดคำสั่งเมื่อพวกเขาหรือผู้อ่านคนอื่น ๆ อาจไม่ทำ คุณไม่เห็นด้วย @PiotrDobrogost?
Let Me Tink About It

การเพิ่ม--userช่วยฉัน!
Honghao Zhang

2
การเปลี่ยนสิทธิ์สำหรับsite-packagesไดเร็กทอรีทั้งหมดของ Python นั้นคล้ายกับการ "แก้ไข" ปั๊มโดยการตีด้วยประแจ มันได้รับการคุ้มครองสำหรับเหตุผล - คุณไม่ควรจะติดตั้งสิ่งที่มี จริงการแก้ปัญหาคือไม่ได้ที่จะผสมระบบการกระจายหลามกับการเขียนโปรแกรมแบบวันต่อวัน ติดตั้งการแจกจ่าย Python อื่น (จาก Python.org, Homebrew, Canopy ฯลฯ )
charlesreid1

9

เนื่องจากฉันมีปัญหาเดียวกันฉันต้องการเน้นว่าจริงๆแล้วความคิดเห็นแรกของBrian Cainคือวิธีแก้ปัญหา "IOError: [Errno 13]" - ปัญหา:

หากดำเนินการในไดเรกทอรีชั่วคราว ( cd /tmp) ที่ IOError sudo pip install fooจะไม่เกิดขึ้นอีกต่อไปถ้าผมทำงาน


2
มีโอกาสใดที่คุณสามารถอธิบายได้ว่าเหตุใดสิ่งนี้จึงแก้ปัญหาให้คุณได้
คริส

8
คุณยังคงใช้sudo pipกับ "โซลูชัน" นี้และติดตั้งแพ็คเกจที่มีสิทธิ์ root ซึ่งอาจไม่ใช่สิ่งที่คุณต้องการ?
คริส

ฉันเดาได้แค่ว่าทำไมถึงได้ผล: ฉันคิดว่าสคริปต์การติดตั้ง pip บางส่วน (บางส่วน) ต้องการการเข้าถึงการเขียนไปยังไดเร็กทอรีปัจจุบัน แต่มีผู้ใช้รายอื่น ดังนั้นหากดำเนินการในขณะที่อยู่ในโฮมไดเร็กทอรีของคุณจะล้มเหลวอย่างลึกลับเนื่องจากไม่มีสิทธิ์ในการเขียน ถ้าเรียกจากภายใน/tmpก็ใช้ได้เพราะทุกคนมีสิทธิ์เขียนที่นั่น
Edgar

เขาไม่มีสิทธิ์เขียน '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you

5

ฉันมีปัญหาในการติดตั้งvirtualenvwrapperหลังจากติดตั้งสำเร็จvirtualenvหลังจากที่ประสบความสำเร็จในการติดตั้ง

เทอร์มินัลของฉันบ่นหลังจากฉันทำสิ่งนี้:

pip install virtualenvwrapper

ดังนั้นฉันจึงลองสิ่งนี้ไม่สำเร็จ(ไม่แนะนำ) :

sudo pip install virtualenvwrapper

จากนั้นฉันติดตั้งสำเร็จด้วยสิ่งนี้:

pip install --user virtualenvwrapper

ตัวเลือก --user สำหรับ pip ถูกกำหนดให้เป็นวิธีแก้ปัญหาในคำตอบของฉันซึ่งมีอยู่แล้วเมื่อคุณเขียนของคุณ นี่ควรเป็นความคิดเห็นที่ไม่ใช่คำตอบ
Piotr Dobrogost

คุณบอกว่าไม่แนะนำ แต่บันทึกการติดตั้งอย่างเป็นทางการบอกว่าตกลงเพื่อติดตั้ง Virtualenvwrapper ด้วย sudo เช่นเดียวกันสำหรับ Virtualenv คำถามที่ถามที่นี่ไม่ได้อ้างอิงถึงสองข้อนี้ดังนั้นฉันคิดว่าคำตอบอื่น ๆ ทั้งหมดที่นี่มีไว้สำหรับแพ็คเกจ python ทั่วไป
mehmet

สำหรับผู้อ่านในอนาคตฉันได้ใช้การตั้งค่าสถานะ "ไม่แนะนำ" ในคำตอบของฉันเนื่องจากความคิดเห็นด้านบน แต่ฉันยังไม่ได้ตรวจสอบ นั่นเป็นเหตุผลที่ฉันยังไม่ลบแฟล็ก
Let Me Tink About It

4

ดูเหมือนว่าสิทธิ์ของคุณจะยุ่งเหยิง พิมพ์chown -R markwalker ~Terminal แล้วลองpipอีกครั้งไหม แจ้งให้เราทราบหากคุณจัดเรียง


แม้ว่าวิธีนี้อาจช่วยแก้ปัญหาสิทธิ์ได้ แต่ก็ไม่ได้ตอบคำถาม
Burhan Khalid

1
การแก้ปัญหาที่ฉันไม่รู้คือโบนัส! chownกำลังให้Operation not permittedกับ dirs ที่ซ่อนอยู่มากมายเช่น.shsh& ฉันคิดว่ามันทำงานผ่านไฟล์ที่สามารถตั้งค่าได้ในตอนนี้ แต่ฉันจะดูว่าจะเกิดอะไรขึ้นเมื่อพรอมต์ cli กลับมา
markwalker_
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.