การติดตั้ง pip ล้มเหลวด้วย: OSError: [Errno 13] การอนุญาตถูกปฏิเสธบนไดเร็กทอรี


123

pip install -r requirements.txtOSError: [Errno 13] Permission denied: '/usr/local/lib/...ล้มเหลวด้วยข้อยกเว้นดังต่อไปนี้ เกิดอะไรขึ้นและฉันจะแก้ไขได้อย่างไร (ฉันกำลังพยายามตั้งค่าDjango )

Installing collected packages: amqp, anyjson, arrow, beautifulsoup4, billiard, boto, braintree, celery, cffi, cryptography, Django, django-bower, django-braces, django-celery, django-crispy-forms, django-debug-toolbar, django-disqus, django-embed-video, django-filter, django-merchant, django-pagination, django-payments, django-storages, django-vote, django-wysiwyg-redactor, easy-thumbnails, enum34, gnureadline, idna, ipaddress, ipython, kombu, mock, names, ndg-httpsclient, Pillow, pyasn1, pycparser, pycrypto, PyJWT, pyOpenSSL, python-dateutil, pytz, requests, six, sqlparse, stripe, suds-jurko
Cleaning up...
Exception:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 122, in main
    status = self.run(options, args)
  File "/usr/lib/python2.7/dist-packages/pip/commands/install.py", line 283, in run
    requirement_set.install(install_options, global_options, root=options.root_path)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 1436, in install
    requirement.install(install_options, global_options, *args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 672, in install
    self.move_wheel_files(self.source_dir, root=root)
  File "/usr/lib/python2.7/dist-packages/pip/req.py", line 902, in move_wheel_files
    pycompile=self.pycompile,
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 206, in move_wheel_files
    clobber(source, lib_dir, True)
  File "/usr/lib/python2.7/dist-packages/pip/wheel.py", line 193, in clobber
    os.makedirs(destsubdir)
  File "/usr/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/amqp-1.4.6.dist-info'

ที่เกี่ยวข้อง (เฉพาะ macOS / homebrew) stackoverflow.com/questions/33004708/…
wim

คำตอบ:


76

ตัวเลือกก) สร้าง Virtualenv เปิดใช้งานและติดตั้ง:

virtualenv .venv
source .venv/bin/activate
pip install -r requirements.txt

ตัวเลือก b) ติดตั้งในบ้านของคุณ:

pip install --user -r requirements.txt

คำแนะนำของฉันใช้ตัวเลือก safe (a) เพื่อให้ข้อกำหนดของโครงการนี้ไม่รบกวนข้อกำหนดอื่น ๆ ของโครงการ


2
ฉันได้รับข้อผิดพลาดเช่นนี้sudo:pip: command not foundในอินสแตนซ์ aws ec2 ของฉันเมื่อเรียกใช้คำสั่งนี้ กรุณาช่วย.
user3768495

2
@ user3768495 อาจเป็นไปได้ว่า pip ไม่ได้รับการติดตั้งโดยค่าเริ่มต้น EC2 ของคุณคืออะไร? นอกจากนี้ python2 อาจไม่ได้รับการติดตั้งดังนั้นคุณจะติดตั้ง python2 หรือใช้ pip3 ระวังเรื่องนี้ด้วย
hectorcanto

33
ฉันอ่านแล้วไม่แนะนำในหลาย ๆ ที่ในขณะนี้ ดูเหมือนว่าเราควรระมัดระวังการใช้งาน sudo เมื่อเรียกใช้ pip (ดูคำตอบของ Bert)
Justus Eapen

3
@JustusEapen: ฉันไม่รู้ว่าฉันรู้สึกยังไงกับเรื่องนั้น ฉันไม่คิดว่าคำตอบที่ถูกต้องสำหรับคำถามของ OP คือคู่มือเกี่ยวกับสุขอนามัยของคอมพิวเตอร์ขั้นพื้นฐานซึ่งรวมถึง "อย่าใช้รหัสที่ไม่บังแดดด้วยสิทธิ์ของผู้ใช้ขั้นสูง" และ "แปรงฟันเป็นประจำ" ฉันพบว่าคำตอบที่ดีที่สุดควรชี้ให้เห็นว่าแพคเกจสามารถติดตั้งได้สำหรับผู้ใช้แต่ละรายหรือทั้งระบบและการติดตั้งทั้งระบบตามที่ OP ต้องการ (มีเหตุผลที่ยุ่งยากอย่างสมบูรณ์ในการทำเช่นนั้น) ต้องได้รับอนุญาตจากผู้ใช้ขั้นสูง ข้อควรระวังในการติดตั้งแพ็กเกจบนเส้นทางระบบอาจเป็นงานอื่นสำหรับคำถาม SO อื่น ๆ
Tobia Tesan

8
การลงคะแนนเนื่องจากsudoคำแนะนำ แม้ว่าตอนนี้จะใช้งานได้ แต่มันจะทำให้คุณปวดหัวมากในอนาคต
เจอรัลด์

318

จริงๆเราควรจะหยุดการให้คำปรึกษาการใช้งานด้วยsudo จะดีกว่าครั้งแรกลองpip install pip install --userหากล้มเหลวนั้นจะดูที่โพสต์ด้านบนที่นี่

เหตุผลที่คุณไม่ควรใช้sudoมีดังนี้:

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


5
สังเกตดีๆ. หลังจากนั้นก็ไปเพื่อทุกsudo x installคนx(รวมถึงx = make)
Tobia Tesan

1
สิ่งนี้ยังช่วยแก้ปัญหาของฉัน การเพิ่ม - ผู้ใช้ทำอะไร?
Miles Johnson

1
@MilesJohnson การเพิ่มการ--userติดตั้งแพ็กเกจในโฮมไดเร็กทอรีของคุณแทนที่จะเป็น root การติดตั้งบางอย่างในตำแหน่งนี้ไม่จำเป็นต้องมีสิทธิ์พิเศษใด ๆ
bert

1
นอกจากนี้หากคุณอยู่บนเซิร์ฟเวอร์ระยะไกลหลังพร็อกซี "sudo" จะป้องกันไม่ให้คุณดึงแพ็กเกจจากที่เก็บอินเทอร์เน็ตและ / หรือที่เก็บ git ของเครือข่ายเซิร์ฟเวอร์ระยะไกล
Ataxias

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

28

คุณกำลังพยายามติดตั้งแพ็กเกจบนพา ธ ทั้งระบบโดยไม่ได้รับอนุญาตให้ทำเช่นนั้น

  1. โดยทั่วไปแล้วคุณสามารถใช้sudoเพื่อให้ได้ชั่วคราวsuperuser สิทธิ์ในความรับผิดชอบของคุณเพื่อติดตั้งแพคเกจบนเส้นทางทั้งระบบ:

     sudo pip install -r requirements.txt

    ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับที่นี่sudo

    อันที่จริงนี่เป็นความคิดที่ไม่ดีและไม่มีกรณีการใช้งานที่ดีโปรดดูความคิดเห็นของ @ wim

  2. หากคุณไม่ต้องการทำการเปลี่ยนแปลงทั้งระบบคุณสามารถติดตั้งแพ็กเกจบนพา ธต่อผู้ใช้ของคุณโดยใช้--userแฟล็ก

    สิ่งที่ต้องทำคือ:

     pip install --user runloop requirements.txt
  3. สุดท้ายสำหรับการควบคุมที่ละเอียดยิ่งขึ้นคุณยังสามารถใช้Virtualenvซึ่งอาจเป็นโซลูชันที่เหนือกว่าสำหรับสภาพแวดล้อมการพัฒนาโดยเฉพาะอย่างยิ่งหากคุณกำลังทำงานในหลายโครงการและต้องการติดตามการอ้างอิงของแต่ละคน

    หลังจากเปิดใช้งาน Virtualenv ของคุณด้วย

    $ my-virtualenv/bin/activate

    คำสั่งต่อไปนี้จะติดตั้งแพ็กเกจภายใน Virtualenv ( ไม่ใช่บนพา ธ ทั้งระบบ):

    pip install -r requirements.txt


4
การใช้ pip ด้วยรูทมาพร้อมกับความเสี่ยงด้านความปลอดภัย
Nrzonline

การรันอะไรก็ตามที่รันโค้ดจากอินเทอร์เน็ตเมื่อรูทมาพร้อมกับความเสี่ยงด้านความปลอดภัย
Tobia Tesan

นี่เป็นคำตอบที่ดีที่สุด แต่ก็ยังต้องอัปเดต ก) ตอนนี้เรามีpyenv/pipenvแล้วควรพูดถึงสิ่งเหล่านั้นตามความต้องการของvirtualenv(หรือconda-env) b) sudo ถือว่าเป็นอันตรายและดูคำตอบอื่น ๆ ว่าทำไม ดังนั้นให้ใส่คำตอบตาม env ก่อนและ sudo สุดท้ายด้วยข้อจำกัดความรับผิดชอบใหญ่
smci

1
sudo pip install -r requirements.txtไม่เคยถูก สภาพแวดล้อมหลามของระบบเป็นระบบที่ระยะเวลา ถ้าคุณทำสิ่งที่ติดตั้งหลามมากยิ่งขึ้นในระบบที่ทำมันด้วยแพคเกจผู้จัดการเท่านั้น (เช่นsudo yum install, apt-getฯลฯ ... ) ตั้งแต่ Repos เหล่านั้นควรจะมีรุ่นที่ปลอดภัยและเข้ากันได้ของห้องสมุดประโยชน์
Wim

1
@TobiaTesan รหัสเก่าที่sudo make installคอมไพล์แล้วโดยปกติแล้ว + เชื่อมโยงนั้นไม่ได้มีความคล้ายคลึงกันมากนักsudo pip installเนื่องจากการติดตั้งเข้ากับระบบ Python env สามารถทำให้การอ้างอิงเป็นโมฆะได้ สมมติว่ามีบริการระบบpython-frobnicatorซึ่งมีการพึ่งพาfroblib(สิ่งนี้จะอยู่ในตัวจัดการแพ็กเกจและตรึงไว้ที่เวอร์ชันที่เข้ากันได้) จากนั้นคุณจะsudo pip installมีแอปหรือ lib อื่น ๆ ที่มีการพึ่งพา " froblib > 1.2" Pip ยินดีจะ "อัปเกรด" เวอร์ชันระบบfroblibด้วยเวอร์ชันที่ใหม่กว่าซึ่งอาจเข้ากันไม่ได้ / ไม่ได้ทดสอบและทำให้ระบบเสียหาย
Wim

26

เพียงแค่ชี้แจงว่าอะไรได้ผลสำหรับฉันหลังจากเจ็บปวดอย่างมากใน linux (อิงตามอูบุนตู) จากข้อผิดพลาดที่ปฏิเสธการอนุญาตและใช้ประโยชน์จากคำตอบของ Bert ข้างต้นตอนนี้ฉันใช้ ...

$ pip install --user <package-name>

หรือถ้าเรียกใช้ pip บนไฟล์ข้อกำหนด ...

$ pip install --user -r requirements.txt

และทำงานได้อย่างน่าเชื่อถือสำหรับทุกการติดตั้ง pip รวมถึงการสร้างสภาพแวดล้อมเสมือน

อย่างไรก็ตามวิธีแก้ปัญหาที่สะอาดที่สุดจากประสบการณ์เพิ่มเติมของฉันคือการติดตั้งpython-virtualenvและvirtualenvwrapperด้วยsudo apt-get installในระดับระบบ

จากนั้นภายในสภาพแวดล้อมเสมือนให้ใช้pip installโดยไม่มี--userแฟล็กANDโดยไม่sudoใช้ โดยรวมแล้วสะอาดกว่าปลอดภัยกว่าและง่ายกว่ามาก


ฉันได้รับ "ไม่สามารถทำการติดตั้ง '- ผู้ใช้' ได้ไซต์แพ็คเกจของผู้ใช้ไม่สามารถมองเห็นได้ใน Virtualenv นี้" เกิดข้อผิดพลาดขณะพยายามใช้pip install --user -r requirements.txt
Amir A. Shabani

@ AmirA.Shabani คำตอบได้รับการแก้ไขตั้งแต่คำถามของคุณ ตอนนี้มีข้อความว่า«ภายในสภาพแวดล้อมเสมือนใช้การติดตั้ง pip โดยไม่มี - ผู้ใช้แฟล็กและไม่มี sudo »
Daishi

7

ผู้ใช้ไม่มีสิทธิ์เขียนสำหรับเส้นทางการติดตั้ง Python บางเส้นทาง คุณสามารถให้สิทธิ์ได้โดย:

sudo chown -R $USER /absolute/path/to/directory

ดังนั้นคุณควรให้สิทธิ์แล้วลองติดตั้งอีกครั้งหากคุณมีเส้นทางใหม่คุณควรให้สิทธิ์:

sudo chown -R $USER /usr/local/lib/python2.7/

2
สำหรับ python ที่ติดตั้งด้วย brew นี่คือคำตอบที่ถูกต้องเนื่องจาก brew รักษาแพ็กเกจในฐานะผู้ใช้ภายในเครื่อง (ไม่มีรูท)
idbrii

9
การควบคุม / usr / local dir ไม่ใช่ความคิดที่ดี ไม่ได้เป็นของผู้ใช้ คุณควรอ่านเกี่ยวกับโครงสร้างไฟล์ unix
user8162

6
/usrโดยทั่วไปสิ่งที่อยู่ภายใต้จะเป็นของรูทในปัจจุบัน การสำลักซ้ำ ๆ อาจทำให้ระบบของคุณเสียหาย หลีกเลี่ยง
Wim

0

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

sudo python -m pip install --user -r package_name

ดูเหมือนจะดีสำหรับฉัน แต่คุณช่วยเพิ่มคำอธิบายได้ไหม
pythonic833

-1

ดังนั้นฉันจึงได้รับข้อผิดพลาดเดียวกันนี้ด้วยเหตุผลที่แตกต่างอย่างสิ้นเชิง เนื่องจากข้อผิดพลาด Homebrew + pip ที่แยกจากกันโดยสิ้นเชิงฉันได้ติดตามวิธีแก้ปัญหานี้ซึ่งระบุไว้ในเอกสารความช่วยเหลือของ Google Cloud ซึ่งคุณสร้างไฟล์. pydistutils.cfg ในโฮมไดเร็กทอรีของคุณ ไฟล์นี้มีการกำหนดค่าพิเศษที่คุณควรใช้สำหรับการติดตั้งไลบรารีบางแห่งเท่านั้น ฉันควรจะลบไฟล์ disutils.cfg นั้นออกหลังจากติดตั้งแพ็คเกจ แต่ฉันลืมทำเช่นนั้น ดังนั้นการแก้ไขสำหรับฉันจริงๆแล้วก็แค่ ...

rm ~/.pydistutils.cfg.

จากนั้นทุกอย่างก็ทำงานได้ตามปกติ แน่นอนว่าหากคุณมีการกำหนดค่าบางอย่างในไฟล์นั้นด้วยเหตุผลที่แท้จริงคุณจะไม่ต้องการแค่ตรง rm ไฟล์นั้น แต่ในกรณีที่มีคนอื่นทำวิธีแก้ปัญหานั้นแล้วและลืมลบไฟล์นั้นนี่เป็นเคล็ดลับสำหรับฉัน!


-1

มันเป็นปัญหาการอนุญาตเนื่องจาก

sudo chown -R $USER /path to your python installed directory

ค่าเริ่มต้นจะเป็น /usr/local/lib/python2.7/

หรือลอง

pip install --user -r package_name

แล้วพูดว่าpip install -r requirements.txtสิ่งนี้จะติดตั้งภายใน env ของคุณ

อย่าพูดว่าsudo pip install -r requirements.txtนี่จะติดตั้งในเส้นทางหลามโดยพลการ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.