Có thể chấp nhận và an toàn để chạy cài đặt pip dưới sudo không?


114

Tôi đã bắt đầu sử dụng máy Mac của mình để cài đặt các gói Python giống như cách tôi làm với PC Windows của mình tại nơi làm việc; tuy nhiên trên máy Mac của tôi, tôi thường xuyên gặp lỗi bị từ chối cho phép khi ghi vào tệp nhật ký hoặc gói trang.

Vì vậy, tôi đã nghĩ đến việc chạy pip install <package>dưới sudonhưng đó có phải là cách sử dụng sudo an toàn / có thể chấp nhận được không vì tôi chỉ muốn cài đặt này trong tài khoản người dùng hiện tại của mình?

Ví dụ theo dõi lại từ một lỗi I / O của tệp nhật ký:

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'

Cập nhật Điều này có thể do quyền, tuy nhiên, cách tốt nhất là sử dụng môi trường ảo cho các dự án python của bạn. sudo pipNên tránh chạy bộ trừ khi thực sự cần thiết.


12
Tôi thấy rằng ' cd /tmp; sudo pip install foo' là một giải pháp phù hợp.
Brian Cain


@pradyunsg tại sao lại gắn cờ một câu hỏi cũ như vậy?
markwalker_

3
Về bản chất, câu trả lời được chấp nhận hiện tại (và cập nhật trong câu hỏi) đề xuất chạy "sudo pip" - điều mà những người bảo trì pip (tôi là một trong số họ) đang tích cực nói với mọi người không nên làm vì điều đó có thể dẫn đến phá vỡ hệ điều hành của bạn trên MacOS và nhiều (tất cả?) các bản phân phối Linux lớn. Tôi đã hạ cánh ở đây trong khi sử dụng các thuật ngữ mà ai đó có thể gỡ lỗi tình huống của họ và chỉ muốn điều này chuyển hướng mọi người đến một địa điểm có lời khuyên tốt hơn. Tôi đã không nghĩ đến việc thực sự đưa ra câu hỏi này và câu trả lời phù hợp hơn với câu trên. (hết ký tự)
pradyunsg

@markwalker_ bạn có sẵn sàng xóa lời khuyên đó khỏi câu hỏi và có thể thay thế nó bằng lời khuyên tốt hơn (sử dụng --user hoặc virtualenv) không?
pradyunsg

Câu trả lời:


105

Sử dụng môi trường ảo :

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

Bạn chỉ sử dụng sudohoặc quyền nâng cao khi bạn muốn cài đặt nội dung cho quá trình cài đặt Python toàn hệ thống, toàn cầu.

Tốt nhất là sử dụng một môi trường ảo cô lập các gói cho bạn. Bằng cách đó, bạn có thể chơi xung quanh mà không làm ô nhiễm cài đặt python toàn cầu.

Như một phần thưởng, virtualenv không cần quyền cao.


2
Nếu quyền của anh ấy bị xáo trộn đối với thư mục chính của anh ấy , thì việc sử dụng virtualenv không có khả năng giúp được anh ấy
hd1

1
Có, nó sẽ xảy ra, nhưng nó đã xảy ra rồi, vì vậy anh ấy cần phải sửa nó trước khi tiếp tục.
hd1

1
Cảm ơn các bạn, tôi đã đọc về virtualenv trước đây nên hy vọng hai giải pháp này kết hợp với nhau sẽ giúp tôi trở lại đúng hướng :)
markwalker_

1
Ngoài ra, để cài đặt virtualenv, bạn cần phải sửa ... hoặc có cách giải quyết khác không?
jimijazz

8
Tôi không hiểu tại sao đây là câu trả lời tốt nhất. Câu hỏi KHÔNG phải về môi trường ảo. Đó là về tính hợp lệ của việc sử dụng sudo pip install. Giả sử tôi cần cài đặt một số gói mà tôi sẽ sử dụng trong nhiều dự án hoặc ở cấp hệ thống. Chẳng hạn như một số công cụ CLI như pgcli. Rõ ràng là tôi không cần một env ảo cho nó, tôi muốn cài đặt nó trên toàn cầu. Tôi có nên sử dụng sudo pip installhoặc có một số thực hành đúng hơn? Đó là câu hỏi.
Alex Belyaev

42

Nó có được chấp nhận và an toàn để chạy pip installdưới sudokhông?

Nó không an toàn và nó đang bị phản đối - hãy xem Những rủi ro khi chạy 'sudo pip' là gì? Để cài đặt gói Python trong thư mục chính, bạn không cần đặc quyền root. Xem mô tả của --usertùy chọn để pip.


Mặc dù giải pháp của bạn là giải pháp đầu tiên thực sự hoạt động, nhưng @throws_exceptions_at_you đã tạo phản hồi bằng mã thực chứ không phải chuyển hướng đến tài liệu
Edenshaw

Tôi sudo pip installkhông biết thiệt hại của việc sử dụng nó. Làm cách nào để hoàn tác lệnh này hoặc lệnh chặn để chạy dưới đây sudo?
Emre Değirmenci

26

Vấn đề ban đầu của bạn là pip không thể ghi nhật ký vào thư mục.

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

Bạn cần phải cd vào một thư mục trong đó tiến trình được gọi có thể viết như /tmpvậy a cd /tmpvà việc gọi lại lệnh có thể sẽ hoạt động nhưng không phải là điều bạn muốn.

NHƯNG thực sự cho trường hợp cụ thể này (bạn không muốn sử dụng sudođể cài đặt gói python) và không cần cài đặt gói toàn cầu, bạn có thể sử dụng --usercờ như sau:

pip install --user <packagename>

và nó sẽ hoạt động tốt.

Tôi giả sử bạn đã cài đặt python python một người dùng và không muốn bận tâm đến việc đọc về virtualenv (không thân thiện với người dùng) hoặc pipenv .

Như một số người trong phần nhận xét đã chỉ ra, cách tiếp cận tiếp theo không phải là một ý tưởng hay trừ khi bạn không biết phải làm gì và gặp khó khăn:

Một cách tiếp cận khác cho các gói toàn cầu như trong trường hợp của bạn, bạn muốn làm điều gì đó như:

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

hoặc nói chung

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

9
-1 Thay đổi quyền sở hữu thư mục gói trang web toàn cầu là một điều tồi tệ phải làm. Các --userlựa chọn cho pip đã được đưa ra như một giải pháp trong câu trả lời của tôi mà đã tồn tại khi bạn viết của bạn.
Piotr Dobrogost

1
Tôi không thấy có tranh cãi ở đây. Cũng với thực tế là ai đó đặt câu hỏi cấp độ đầu vào như vậy có thể không quen thuộc với hệ thống cấp phép của unix và do đó việc chạy cài đặt 1 người dùng sẽ không thành vấn đề. Ngoài ra câu trả lời của bạn thực sự không giải quyết được trường hợp sử dụng của tôi thực sự MUỐN cài đặt vào các gói toàn cầu. Sau khi làm điều đó, tôi có thể dễ dàng hoàn nguyên các quyền về cài đặt trước.
throws_exceptions_at_you

2
+1 để thực sự viết toàn bộ lệnh. Một số người cho rằng OP biết cách triển khai một tùy chọn tại dòng lệnh khi họ hoặc các trình đọc khác có thể không. Bạn có đồng ý không, @PiotrDobrogost?
Let Me Tink About It

thêm --usergiúp tôi!
Honghao Zhang

2
Thay đổi quyền cho toàn bộ site-packagesthư mục của hệ thống Python cũng giống như "sửa chữa" một máy bơm bằng cách dùng cờ lê đâm vào nó. Nó được bảo vệ vì một lý do - bạn không được phép cài đặt nội dung ở đó . Các thực giải pháp không phải là để trộn phân phối Python hệ thống với chương trình ngày-to-ngày. Cài đặt bản phân phối Python khác (từ Python.org, Homebrew, Canopy, v.v.).
charlesreid1

9

Bởi vì tôi đã gặp vấn đề tương tự, tôi muốn nhấn mạnh rằng thực sự là nhận xét đầu tiên của Brian Cain là giải pháp cho "IOError: [Errno 13]" - vấn đề:

Nếu được thực thi trong thư mục tạm thời ( cd /tmp), IOError không xảy ra nữa nếu tôi chạy sudo pip install foo.


2
Bất kỳ cơ hội nào bạn có thể giải thích tại sao điều này giải quyết được vấn đề cho bạn?
Chris

8
bạn vẫn đang sử dụng sudo pipvới "giải pháp" này và do đó cài đặt các gói có đặc quyền root, đó có thể không phải là điều bạn muốn?
Chris

Tôi chỉ có thể đoán tại sao điều này hoạt động: Tôi nghĩ rằng một số phần của (một số) tập lệnh cài đặt pip yêu cầu quyền ghi vào thư mục hiện tại, nhưng với một người dùng khác. Do đó, nếu được thực thi khi đang ở trong thư mục chính của bạn, nó sẽ thất bại một cách bí ẩn vì thiếu quyền ghi. Nếu được gọi từ bên trong /tmpnó hoạt động, bởi vì mọi người đều có quyền ghi ở đó.
Edgar

Anh ấy không có quyền ghi vào '/Users/markwalker/Library/Logs/pip.log'
throws_exceptions_at_you 16/02/18

5

Tôi gặp sự cố virtualenvwrapperkhi cài đặt sau khi cài đặt thành công virtualenv.

Thiết bị đầu cuối của tôi đã phàn nàn sau khi tôi làm điều này:

pip install virtualenvwrapper

Vì vậy, tôi đã thử điều này không thành công (KHÔNG ĐƯỢC KHUYẾN NGHỊ) :

sudo pip install virtualenvwrapper

Sau đó, tôi đã cài đặt thành công nó với cái này:

pip install --user virtualenvwrapper

Tùy chọn --user cho pip đã được đưa ra như một giải pháp trong câu trả lời của tôi đã tồn tại khi bạn viết bài của mình. Đây đáng lẽ là một bình luận không phải là một câu trả lời.
Piotr Dobrogost

bạn nói KHÔNG được khuyến nghị nhưng ghi chú cài đặt chính thức cho biết OK để cài đặt virtualenvwrapper với sudo. Tương tự đối với virtualenv. Câu hỏi được hỏi ở đây không liên quan đến hai câu hỏi đó, vì vậy tôi cho rằng tất cả các câu trả lời khác ở đây là dành cho các gói python chung.
mehmet

Đối với các độc giả trong tương lai, tôi đã gạch đầu dòng "không được khuyến nghị" trong câu trả lời của mình do nhận xét trên nhưng tôi chưa xác minh nó. Đó là lý do tại sao tôi vẫn chưa xóa cờ.
Let Me Tink About It

4

Có vẻ như các quyền của bạn bị xáo trộn. Gõ chown -R markwalker ~trong Terminal và cố gắng pipmột lần nữa? Hãy cho tôi biết nếu bạn được sắp xếp.


Mặc dù điều này có thể giải quyết vấn đề về quyền, nhưng nó không trả lời câu hỏi.
Burhan Khalid

1
Giải quyết được những vấn đề tôi không biết là một phần thưởng! chownđang cung cấp Operation not permittedrất nhiều dirs ẩn như .shsh& tôi cho rằng nó đang hoạt động thông qua các tệp mà nó có thể đặt ngay bây giờ, nhưng tôi sẽ xem điều gì sẽ xảy ra khi dấu nhắc cli trả về.
markwalker_
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.