cài đặt pip không thành công với: OSError: [Errno 13] Quyền bị từ chối trên thư mục


123

pip install -r requirements.txtthất bại với ngoại lệ dưới đây OSError: [Errno 13] Permission denied: '/usr/local/lib/.... Có gì sai và làm cách nào để khắc phục điều này? (Tôi đang cố gắng thiết lập 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'

Liên quan (cụ thể là macOS / homebrew) stackoverflow.com/questions/33004708/iêu
wim

Câu trả lời:


76

Tùy chọn a) Tạo virtualenv, kích hoạt nó và cài đặt:

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

Tùy chọn b) Cài đặt trong homedir của bạn:

pip install --user -r requirements.txt

Đề xuất của tôi sử dụng tùy chọn an toàn (a), để các yêu cầu của dự án này không can thiệp vào các yêu cầu dự án khác.


2
Tôi đã gặp một lỗi như thế này sudo:pip: command not foundtrên ví dụ aws ec2 của tôi khi chạy lệnh này. Xin vui lòng giúp đỡ.
dùng3768495

2
@ user3768495 Có thể, pip không được cài đặt theo mặc định. Bản phân phối nào là EC2 của bạn? Ngoài ra, python2 có thể không được cài đặt, vì vậy hoặc bạn cài đặt python2 hoặc sử dụng pip3. Hãy cẩn thận với điều này mặc dù.
hectorcanto

33
Tôi đã đọc điều này không được khuyến khích ở nhiều nơi. Có vẻ như chúng ta nên thận trọng chống lại việc sử dụng sudo khi chạy pip (xem câu trả lời của Bert)
Justus Eapen 11/03/2017

3
@JustusEapen: Tôi không biết tôi cảm thấy thế nào về điều đó. Tôi không nghĩ câu trả lời thích hợp cho câu hỏi của OP là hướng dẫn về vệ sinh máy tính cơ bản, bao gồm "không chạy mã mờ với quyền siêu người dùng" và "đánh răng thường xuyên". Tôi thấy câu trả lời tối ưu nên chỉ ra rằng các gói có thể được cài đặt trên cơ sở cho mỗi người dùng hoặc toàn hệ thống, và việc cài đặt trên toàn hệ thống, như OP mong muốn (có những lý do hoàn toàn phổ biến để làm như vậy) cần có sự cho phép của người dùng. Lưu ý chống lại việc cài đặt các gói trên đường dẫn hệ thống có lẽ là một số công việc khác đối với một số câu hỏi SO khác.
Tobia Tesan

8
xuống cấp vì sudotư vấn. mặc dù nó hoạt động ngay bây giờ, nó sẽ khiến bạn đau đầu trong tương lai.
Gerald

318

Chúng ta thực sự nên ngừng tư vấn sử dụng sudovới pip install. Trước tiên hãy thử pip install --user. Nếu điều này không thành công thì hãy xem bài viết hàng đầu ở đây .

Lý do bạn không nên sử dụng sudonhư sau:

Khi bạn chạy pip với sudo, bạn đang chạy mã Python tùy ý từ Internet với tư cách là người dùng root, đây là một rủi ro bảo mật khá lớn. Nếu ai đó đưa ra một dự án độc hại trên PyPI và bạn cài đặt nó, bạn cấp quyền truy cập root cho kẻ tấn công vào máy của bạn.


5
Quan sát tốt. Điều đó, sau tất cả, đi cho tất cả sudo x install, cho tất cả x(bao gồm x = make).
Tobia Tesan

1
Điều này cũng giải quyết vấn đề của tôi. Việc thêm --user làm gì?
Miles Johnson

1
@MilesJohnson Thêm --usercài đặt gói trong thư mục nhà của bạn, chứ không phải là root. Cài đặt một cái gì đó cho vị trí này không yêu cầu bất kỳ đặc quyền bổ sung.
bert

1
Ngoài ra, nếu bạn đang ở trên một máy chủ từ xa phía sau proxy, "sudo" sẽ ngăn bạn tìm nạp các gói từ kho lưu trữ internet và / hoặc kho git của mạng máy chủ từ xa.
Ataxias

2
Tất cả đề cập đến sudođã được gỡ bỏ một năm trước. Câu trả lời này đã lỗi thời - vui lòng sửa lại và cập nhật nó. Bạn cũng cần đề cập đến mỗi người dùng so với cài đặt trên toàn hệ thống và quyền. Đừng sử dụng câu trả lời của bạn để trực tiếp chỉ trích các câu trả lời khác, điều đó sẽ có xu hướng lỗi thời nhanh chóng.
smci

28

Bạn đang cố gắng cài đặt một gói trên đường dẫn toàn hệ thống mà không có quyền làm như vậy.

  1. Nói chung, bạn có thể sử dụng sudođể tạm thời có được quyền siêu người dùng theo trách nhiệm của mình để cài đặt gói trên đường dẫn toàn hệ thống:

     sudo pip install -r requirements.txt

    Tìm thêm về sudo đây .

    Trên thực tế, đây là một ý tưởng tồi và không có trường hợp sử dụng tốt cho nó, xem bình luận của @ wim.

  2. Nếu bạn không muốn thực hiện các thay đổi trên toàn hệ thống, bạn có thể cài đặt gói trên đường dẫn của mỗi người dùng bằng --usercờ.

    Tất cả phải mất là:

     pip install --user runloop requirements.txt
  3. Cuối cùng, để kiểm soát chi tiết hơn , bạn cũng có thể sử dụng virtualenv , đây có thể là giải pháp ưu việt cho môi trường phát triển, đặc biệt nếu bạn đang làm việc trên nhiều dự án và muốn theo dõi sự phụ thuộc của từng người.

    Sau khi kích hoạt virtualenv của bạn với

    $ my-virtualenv/bin/activate

    lệnh sau sẽ cài đặt gói bên trong virtualenv ( chứ không phải trên đường dẫn toàn hệ thống):

    pip install -r requirements.txt


4
Chạy pip với root đi kèm với rủi ro bảo mật
Nrzonline

Chạy bất cứ thứ gì chạy mã từ Internet là root đều có rủi ro bảo mật.
Tobia Tesan

Đây gần như là câu trả lời tốt nhất, nhưng vẫn cần cập nhật. a) Bây giờ chúng ta pyenv/pipenvnên đề cập đến những điều đó, ưu tiên cho virtualenv(hoặc conda-env) b) sudo được coi là có hại và xem các câu trả lời khác tại sao. Vì vậy, đặt câu trả lời dựa trên env trước, và câu trả lời cuối cùng, với sự từ chối lớn.
smci

1
sudo pip install -r requirements.txtkhông bao giờ đúng Môi trường python của hệ thống thuộc về hệ thống, thời kỳ . Nếu bạn cài đặt nhiều thứ python vào hệ thống, làm điều đó với quản lý gói duy nhất (ví dụ như sudo yum install, apt-get, vv ...) vì những Repos nên có phiên bản an toàn và tương thích của các thư viện có kết quả.
wim

1
@TobiaTesan Các cũ sudo make install, thường được biên soạn + liên kết mã, là không thực sự tương tự với một sudo pip installtừ cài đặt vào hệ thống Python env có thể làm mất hiệu lực phụ thuộc . Giả sử có một dịch vụ hệ thống python-frobnicator, có phụ thuộc vào froblib(dịch vụ này cũng sẽ nằm trong trình quản lý gói và được ghim vào phiên bản tương thích), sau đó bạn sẽ có sudo pip installmột số ứng dụng hoặc lib khác có phụ thuộc vào " froblib > 1.2". Pip sẽ vui vẻ "nâng cấp" phiên bản hệ thống với phiên bản froblibmới hơn, có thể không tương thích / chưa được kiểm tra và phá vỡ hệ thống.
wim

26

Chỉ cần làm rõ những gì đã làm việc cho tôi sau nhiều đau khổ trong linux (dựa trên Ubuntu) về quyền bị từ chối lỗi và tận dụng câu trả lời của Bert ở trên, bây giờ tôi sử dụng ...

$ pip install --user <package-name>

hoặc nếu chạy pip trên tệp yêu cầu ...

$ pip install --user -r requirements.txt

và những công việc này đáng tin cậy cho mọi cài đặt pip bao gồm cả việc tạo môi trường ảo.

Tuy nhiên, giải pháp sạch nhất trong kinh nghiệm hơn nữa của tôi đã được cài đặt python-virtualenvvirtualenvwrappervới sudo apt-get installở cấp hệ thống.

Sau đó, bên trong môi trường ảo, sử dụng pip installmà không có --usercờ không có sudo. Tổng thể sạch hơn, an toàn hơn và dễ dàng hơn.


Tôi nhận được thông báo "Không thể thực hiện cài đặt '--user'. Các gói trang web của người dùng không hiển thị trong virtualenv này." lỗi khi cố gắng sử dụngpip install --user -r requirements.txt
Amir A. Shabani

@ AmirA.Shabani câu trả lời đã được chỉnh sửa kể từ câu hỏi của bạn. Bây giờ nó nói «bên trong môi trường ảo, sử dụng cài đặt pip mà không có cờ --user VÀ không có sudo»
Daishi

7

Người dùng không có quyền ghi cho một số đường dẫn cài đặt Python. Bạn có thể cho phép bằng cách:

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

Vì vậy, bạn nên cấp quyền, sau đó thử cài đặt lại, nếu bạn có đường dẫn mới, bạn cũng nên cấp quyền:

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

2
Đối với python được cài đặt với brew, đây là câu trả lời đúng vì brew duy trì các gói là người dùng cục bộ (không có root).
idbrii

9
chowning / usr / local dir không phải là một ý tưởng tốt. Nó không thuộc về người dùng. Bạn nên đọc về cấu trúc tập tin unix.
dùng8162

6
Những thứ bên dưới /usrthường được sở hữu bởi root, những ngày này. Đệ quy đệ quy có thể làm hỏng hệ thống của bạn. TRÁNH .
wim

0

Nếu bạn cần quyền, bạn không thể sử dụng 'pip' với 'sudo'. Bạn có thể thực hiện một mẹo, để bạn có thể sử dụng 'sudo' và cài đặt gói. Chỉ cần đặt 'sudo python -m ...' trước lệnh pip của bạn.

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

Có vẻ tốt với tôi, nhưng bạn có thể vui lòng thêm một số lời giải thích.
pythonic833

-1

Vì vậy, tôi đã nhận được cùng một lỗi chính xác cho một lý do hoàn toàn khác. Do một lỗi Homebrew + pip hoàn toàn riêng biệt, nhưng tôi đã theo dõi cách giải quyết này được liệt kê trên tài liệu trợ giúp của Google Cloud, nơi bạn tạo tệp .pydistutils.cfg trong thư mục chính của bạn. Tệp này có cấu hình đặc biệt mà bạn chỉ được sử dụng để cài đặt một số thư viện nhất định. Tôi nên xóa tập tin disutils.cfg đó sau khi cài đặt các gói, nhưng tôi quên làm như vậy. Vì vậy, cách khắc phục đối với tôi thực ra chỉ là ...

rm ~/.pydistutils.cfg.

Và sau đó mọi thứ hoạt động như bình thường. Tất nhiên, nếu bạn có một số cấu hình trong tệp đó vì một lý do thực sự, thì bạn sẽ không muốn chỉ rm thẳng tệp đó. Nhưng trong trường hợp bất cứ ai khác đã làm điều đó, và quên xóa tập tin đó, điều này đã giúp tôi!


-1

Đó là vấn đề cho phép,

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

mặc định nó sẽ là /usr/local/lib/python2.7/

hay là thử,

pip install --user -r package_name

và sau đó nói, pip install -r requirements.txtcái này sẽ cài đặt bên trong env của bạn

không nói, sudo pip install -r requirements.txtcái này sẽ cài đặt vào đường dẫn python tùy ý.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.