Cách tránh “Quyền bị từ chối” khi sử dụng pip với virtualenv


93

Tôi cố gắng triển khai một gói Python piptrong môi trường ảo trên máy Ubuntu, nhưng gặp phải sự cố liên quan đến quyền. Ví dụ:

(TestVirtualEnv)test@testServer:~$ pip install markdown2

chấm dứt bởi:

lỗi: không thể tạo '/home/test/virtualenvs/TestVirtualEnv/lib/python3.3/site-packages/markdown2.py': Quyền bị từ chối

Tôi không thể sudo, vì nó sẽ cài đặt gói trên toàn cầu chứ không phải trong môi trường ảo. Tôi chownbiên tập site-packages; lschỉ hiển thị các thư mục liên quan đến easy_install, pipsetuptools, và không có gì liên quan đến Markdown.

Làm thế nào để triển khai một gói trong môi trường ảo pipmà không gặp phải các lỗi liên quan đến quyền?


Chỉ cần làm rõ: bạn đã tạo virtualenv này bằng sudo?
sebastian_oe

@sebastian_oe: Tôi tin rằng tôi đã làm. Tôi sẽ tạo lại một cái để chắc chắn.
Arseni Mourzenko

4
Sau đó, đây có thể là vấn đề. Hãy thử tạo một virtualenv mà không có sudo.
sebastian_oe

1
@sebastian_oe: Tôi đã tạo một môi trường ảo mà không có sudo. Thật vậy, gói cài đặt chính xác ngay bây giờ. Làm ơn, bạn có thể quảng cáo bình luận của mình thành câu trả lời để tôi có thể chấp nhận nó không?
Arseni Mourzenko

1
Ngoài ra, nếu bạn đang chuyển đổi giữa những người dùng khác nhau, hãy đảm bảo rằng bạn đang sử dụng thư mục người dùng sở hữu (hoặc có quyền ghi) virtualenv, vì bạn có thể kích hoạt virtualenvvới người dùng khác, nhưng nó sẽ không cho phép bạn cài đặt bất kỳ gói nào và sẽ cấp quyền truy cập.
Andrius

Câu trả lời:


106

virtualenvsự cố quyền có thể xảy ra khi bạn tạo virtualenvdưới dạng sudovà sau đó hoạt động mà không có sudotrong virtualenv.

Như đã tìm ra trong bình luận câu hỏi của bạn, giải pháp ở đây là tạo ra cái virtualenvkhông có sudođể có thể làm việc (đặc biệt là viết) trong đó mà không cần sudo.


4
nếu tôi muốn tạo nó trong / opt yêu cầu sudo, tôi nghĩ virtualenv sẽ không cài đặt mà không có sudo.
Umair A.

7
@sebastian_oe Tôi nghĩ tôi yêu bạn
Nobbynob Littlun

5
Làm thế nào để tạo virtualenvmà không có sudo?
Tunn

Nếu bạn đã tạo virtualenv bằng sudo, hãy xem câu trả lời của @vingtoft để biết cách sửa lỗi dễ dàng mà không cần tạo lại
David A

103

Giải pháp:

Nếu bạn đã tạo virtualenv dưới dạng root, hãy chạy lệnh sau:

sudo chown -R your_username:your_username path/to/virtuaelenv/

Điều này có thể sẽ khắc phục sự cố của bạn.

Chúc mừng


1
Điều này đã làm việc cho tôi (chown /usr/local/lib/python3.4), ngoại trừ tôi không nghĩ rằng tôi đã tạo một virtualenv làm root, tôi thực sự đã cài đặt Python3.4 làm root. Tôi vẫn đang thử nghiệm, nhưng bạn có nghĩ rằng tôi sẽ gặp phải bất kỳ sự cố nào nữa với giải pháp này không hay giải pháp này sẽ khắc phục được hầu hết các lỗi?
ntk4

3
Làm cách nào để tìm hiểu xem bạn đã tạo virtualenv hay python làm root chưa?
A__

6

Trong trường hợp của tôi, tôi đang sử dụng mkvirtualenv, nhưng không nói với nó rằng tôi sẽ sử dụng python3. Tôi gặp lỗi này:

mkvirtualenv hug
pip3 install hug -U

....
error: could not create '/usr/lib/python3.4/site-packages': Permission denied

Nó hoạt động sau khi chỉ định python3:

mkvirtualenv --python=/usr/bin/python3 hug
pip3 install hug -U

5

Tôi đã không tạo virtualenv của mình bằng sudo. Vì vậy, câu trả lời của Sebastian không áp dụng cho tôi. Dự án của tôi được gọi là utils. Tôi đã kiểm tra utilsthư mục và thấy điều này:

-rw-r--r--   1 macuser  staff   983  6 Jan 15:17 README.md
drwxr-xr-x   6 root     staff   204  6 Jan 14:36 utils.egg-info
-rw-r--r--   1 macuser  staff    31  6 Jan 15:09 requirements.txt

Như bạn có thể thấy, utils.egg-infothuộc sở hữu của rootkhông macuser. Đó là lý do tại sao nó đã cho tôi permission deniedlỗi. Tôi cũng phải xóa /Users/macuser/.virtualenvs/armoury/lib/python2.7/site-packages/utils.egg-linkvì nó cũng được tạo bởi root. Tôi đã làm pip install -e .lại sau khi loại bỏ chúng, và nó hoạt động.


3

Nếu bạn đã tạo môi trường ảo bằng root thì hãy sử dụng lệnh này

sudo su

nó sẽ cung cấp cho bạn quyền truy cập root và sau đó kích hoạt môi trường ảo của bạn bằng cách sử dụng

source /root/.env/ENV_NAME/bin/activate

1

Bạn đã không kích hoạt môi trường ảo trước khi sử dụng pip.

Hãy thử nó với:

$(your venv path) . bin/activate

Và sau đó sử dụng pip -r request.txt trên thư mục chính của bạn


1

Tôi cũng đã từng xảy ra điều này (tình cờ) sau khi tạo một venv mới khi ở trong môi trường ảo hiện có. một cách dễ dàng để chẩn đoán điều này là xem vị trí pythonđược liên kết tượng trưng, ​​tức là chạy:

ls -l venv/bin/python

và đảm bảo rằng nó trỏ đến tệp nhị phân Python thích hợp. Đối với hầu hết các hệ thống, điều này sẽ là /usr/bin/pythonhoặc /usr/bin/python3. trong khi nếu nó trỏ đến một môi trường ảo hiện có, nó sẽ giống như thế /home/youruser/somedir/bin/python. nếu đó là cái sau hơn tôi khuyên bạn nên tạo lại venv trong khi đảm bảo rằng bạn không ở "bên trong" bất kỳ virtualenv hiện có nào (tức là chạy deactivate)


được đăng ở đây bởi vì đó là một câu hỏi phổ biến đề cập đến các từ khóa thích hợp, do đó có nhiều khả năng được tìm thấy và hữu ích cho người khác
Sam Mason

0

Trong khi tạo virtualenv nếu bạn sử dụng sudo, thư mục được tạo với đặc quyền root, vì vậy khi bạn cố gắng cài đặt một gói với người dùng không phải sudo, bạn sẽ không có quyền cài đặt vào đó. Vì vậy, hãy luôn tạo virtualenv mà không có sudo và cài đặt mà không có sudo.

Bạn cũng có thể sao chép các gói được cài đặt trên global python sang virtualenv.

cp -r /lib/python/site-packages/* virtualenv/lib/python/site-packages/

Đây không phải là vấn đề: nếu bạn đọc các bình luận, OP đã tạo env ảo với sudo ngay từ đầu.
NickD
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.