Mục đích của việc cài đặt pip Pip - người dùng trên máy tính là gì?


189

Từ pip install --help:

 --user      Install to the Python user install directory for your platform. Typically ~/.local/, or %APPDATA%\Python on
             Windows. (See the Python documentation for site.USER_BASE for full details.)

Tài liệu cho trang web.USER_BASE là một lỗ sâu đáng sợ của chủ đề thú vị * NIX mà tôi không hiểu.

Mục đích của --usertiếng Anh đơn giản là gì? Tại sao sẽ đặt gói hàng vào ~/.local/vấn đề? Tại sao không đặt một thực thi ở đâu đó trong $ PATH của tôi?


2
bạn có thể import site; print site.USER_SITEin vị trí cài đặt. Đối với tôi, tôi đã nhận được /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages.
Trevor Boyd Smith

1
Trên máy chủ, /usr/local/lib/pythonX.X/dist-packageslà thư mục mặc định cho các gói được cài đặt bởi pip . Nhưng nếu một người dùng muốn cài đặt các gói dành riêng cho người dùng, họ có thể sử dụng $ sudo pip3 --user install some_package. Gói đó sẽ vẫn không có sẵn cho các nhóm và những người khác truy cập máy chủ đó.
noobninja

Câu trả lời:


223

Pip mặc định để cài đặt các gói Python vào một thư mục hệ thống (chẳng hạn như /usr/local/lib/python3.4). Điều này đòi hỏi quyền truy cập root.

--user làm cho các gói cài đặt pip trong thư mục nhà của bạn thay vào đó, không yêu cầu bất kỳ đặc quyền đặc biệt nào.


1
Cảm ơn; Điều đó có ý nghĩa. Nhưng có phải là điểm --userđể đảm bảo rằng một người không chạy gói như root? (Tôi đang tưởng tượng một cái gì đó tương tự như các tùy chọn Wireshark / kismet / burpsuite để thiết lập các chính sách truy cập nhóm, do đó không cho phép tất cả các tính năng của chương trình chạy dưới quyền root. Đây có phải là --usertùy chọn đúng không? để cho phép cài đặt mà không có quyền root? Nếu đó là trường hợp, tại sao tôi không bao giờ sử dụng sudo pip install foo_package? Tôi chưa bao giờ cần root-private để cài đặt qua pip trước đây.
Rob Truxal

12
@Rob Truxal. Tôi nghĩ vấn đề là gói này sẽ không được người dùng khác nhìn thấy. Có thể bạn muốn có một phiên bản cũ hơn / mới hơn của một gói nhưng nếu bạn cài đặt nó trên hệ thống, bạn sẽ làm hỏng các đồng nghiệp làm việc của mình.
NDEthos

4
Oh! Các --userparam là về sự cô lập người dùng! Điều đó làm cho giống như một loạt đạn ý nghĩa. Cảm ơn @NDEthos!
Rob Truxal

ok đây là một câu hỏi (noobish): giả sử rằng tôi đã đăng nhập như một người dùng foo, và sau đó tôi đã chạy lệnh này cài đặt pip --user -r tests.txt .. và mọi thứ được cài đặt tốt. Sau đó, tôi đã đăng nhập như thanh người dùng và chạy chương trình python như vậy: sudo -u foo ./odoo-bin .. nó sẽ đọc từ các gói python đã được cài đặt cho người dùng foo chứ? hoặc làm thế nào mà làm việc?
abbood

1
có cách nào để liệt kê chỉ các gói được cài đặt cho người dùng hiện tại không? tức là cái gì như thế pip freeze --usernào?
abbood

24

--usercài đặt trong site.USER_SITE.

Đối với trường hợp của tôi, nó là /Users/.../Library/Python/2.7/bin. Vì vậy, tôi đã thêm nó vào PATH của tôi (trong ~/.bash_profiletệp):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin

15

Các câu trả lời khác đề cập đến site.USER_SITEnơi các gói Python được đặt. Nếu bạn đang tìm kiếm nhị phân, chúng đi vào{site.USER_BASE}/bin .

Nếu bạn muốn thêm thư mục này vào đường dẫn tìm kiếm của shell, hãy sử dụng:

export PATH="${PATH}:$(python3 -c 'import site; print(site.USER_BASE)')/bin"

14

Chỉ là một cảnh báo:

Theo vấn đề này , --userhiện không hợp lệ trong một env ảopip , vì vị trí người dùng không thực sự có ý nghĩa đối với môi trường ảo.

Vì vậy, không sử dụng pip install --user some_pkg bên trong một môi trường ảo , nếu không, môi trường ảo pipsẽ bị nhầm lẫn. Xem câu trả lời này để biết thêm chi tiết.



8

Trên macOS, lý do sử dụng --usercờ là để đảm bảo chúng tôi không làm hỏng các thư viện mà HĐH dựa vào. Một cách tiếp cận thận trọng đối với nhiều người dùng macOS là tránh cài đặt hoặc cập nhật pip bằng lệnh yêu cầu sudo. Vì vậy, điều này bao gồm cài đặt để/usr/local/bin ...

Tham khảo: Cài đặt python cho Neovim ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

Tôi không tất cả rõ ràng lý do tại sao cài đặt vào /usr/local/binmột nguy cơ trên máy Mac cho thực tế là hệ thống chỉ dựa vào mã nhị phân python trong /Library/Frameworks//usr/bin. Tôi nghi ngờ điều đó bởi vì như đã lưu ý ở trên, việc cài đặt vào /usr/local/binyêu cầu sudosẽ mở ra một sai lầm tốn kém với các thư viện hệ thống. Do đó, cài đặt vào~/.local/bin là một cách chắc chắn để tránh rủi ro này.

Tham chiếu: Sử dụng python trên máy Mac ( https://docs.python.org/2/USE/mac.html )

Cuối cùng, ở mức độ có lợi ích của việc cài đặt các gói vào /usr/local/bin, tôi tự hỏi liệu có nên thay đổi chủ sở hữu của thư mục từ rootsang user? Điều này sẽ tránh phải sử dụng sudotrong khi vẫn bảo vệ chống lại các thay đổi phụ thuộc vào hệ thống. * Đây có phải là mặc định bảo mật là di tích về cách các hệ thống Unix thường được sử dụng trong quá khứ (dưới dạng máy chủ) không? Hoặc tối thiểu, chỉ là một cách tốt để người dùng Mac không lưu trữ máy chủ?

* Lưu ý: Tính năng Bảo vệ toàn vẹn hệ thống (SIP) của Mac dường như cũng bảo vệ người dùng khỏi thay đổi các thư viện phụ thuộc hệ thống.

- E


8

Không có môi trường ảo

pip <command> --user thay đổi phạm vi của lệnh pip hiện tại để hoạt động trên vị trí cài đặt gói python cục bộ của tài khoản người dùng hiện tại, thay vì vị trí cài đặt gói toàn hệ thống, là mặc định.

  • Xem Cài đặt người dùng trong Hướng dẫn sử dụng PIP.

Điều này chỉ thực sự quan trọng trên một máy nhiều người dùng. Mọi thứ được cài đặt vào vị trí hệ thống sẽ hiển thị cho tất cả người dùng, do đó, cài đặt vào vị trí người dùng sẽ tách biệt cài đặt gói đó với những người dùng khác (họ sẽ không nhìn thấy nó và sẽ phải tự cài đặt riêng để sử dụng nó). Do có thể có xung đột phiên bản, nên việc cài đặt gói với các phụ thuộc cần thiết của các gói khác có thể gây ra sự cố, vì vậy tốt nhất không nên đẩy tất cả các gói mà người dùng đã sử dụng đến vị trí cài đặt hệ thống.

  • Nếu là máy một người dùng, có rất ít hoặc không có sự khác biệt nào khi cài đặt vào --user vị trí. Nó sẽ được cài đặt vào một thư mục khác, có thể cần hoặc không cần thêm vào đường dẫn, tùy thuộc vào gói và cách sử dụng (nhiều gói cài đặt các công cụ dòng lệnh phải trên đường dẫn để chạy từ trình bao) .
  • Nếu đó là máy nhiều người dùng, --userđược ưu tiên sử dụng root / sudo hoặc yêu cầu cài đặt quản trị viên và ảnh hưởng đến môi trường Python của mọi người dùng, trừ trường hợp các gói chung mà quản trị viên muốn cung cấp cho tất cả người dùng theo mặc định.
    • Lưu ý: Trên mỗi nhận xét, trên hầu hết các cài đặt Unix / Linux, người ta đã chỉ ra rằng các cài đặt hệ thống nên sử dụng trình quản lý gói chung, chẳng hạn như apt, thay vì pip.

Với môi trường ảo

Các --usertùy chọn trong một môi trường venv / virtualenv hoạt động sẽ cài đặt vào vị trí người sử dụng python địa phương (giống như không có một môi trường ảo).

Các gói được cài đặt vào môi trường ảo theo mặc định, nhưng nếu bạn sử dụng --usernó sẽ buộc nó phải cài đặt bên ngoài môi trường ảo, trong thư mục tập lệnh python của người dùng (trong Windows, hiện tại đây là c:\users\<username>\appdata\roaming\python\python37\scriptsdành cho tôi với Python 3.7).

Tuy nhiên, bạn sẽ không thể truy cập cài đặt hệ thống hoặc người dùng từ trong môi trường ảo (ngay cả khi bạn đã sử dụng --userkhi ở trong môi trường ảo).

Nếu bạn cài đặt một môi trường ảo với --system-site-packagesđối số, bạn sẽ có quyền truy cập vào thư mục tập lệnh hệ thống cho python. Tôi tin rằng điều này bao gồm cả thư mục kịch bản python của người dùng, nhưng tôi không chắc chắn. Tuy nhiên, có thể có những hậu quả không lường trước cho việc này và đó không phải là cách dự định sử dụng môi trường ảo.


Vị trí của hệ thống Python và các thư mục cài đặt người dùng cục bộ

Bạn có thể tìm vị trí của thư mục cài đặt người dùng cho python với python -m site --user-base. Tôi đang tìm thấy thông tin mâu thuẫn trong Q & A, tài liệu và thực sự sử dụng lệnh này trên PC của tôi để biết mặc định là gì, nhưng chúng nằm bên dưới thư mục nhà của người dùng ( ~phím tắt trong * nix và c:\users\<username>thường là cho Windows).


Những chi tiết khác

Các --usertùy chọn không phải là một giá trị cho mỗi lệnh. Ví dụ: pip uninstallsẽ tìm và gỡ cài đặt các gói ở bất cứ nơi nào chúng được cài đặt (trong thư mục người dùng, thư mục môi trường ảo, v.v.) và --usertùy chọn không hợp lệ.

Những thứ được cài đặt pip install --usersẽ được cài đặt ở một vị trí cục bộ sẽ chỉ được nhìn thấy bởi tài khoản người dùng hiện tại và sẽ không yêu cầu quyền truy cập root (trên * nix) hoặc quyền truy cập của quản trị viên (trên Windows).

Các --userSửa lựa chọn tất cả pip các lệnh mà chấp nhận nó để xem / hoạt động trên người sử dụng cài đặt thư mục, vì vậy nếu bạn sử dụng pip list --usernó sẽ chỉ cho bạn thấy các gói cài đặt với pip install --user.


1
Bạn có muốn xem xét lại phần đầu tiên? Bên ngoài môi trường ảo Python, tốt nhất là tránh sử dụng pip installmà không --userhoàn toàn. Điều này sẽ cài đặt các gói Python ở những nơi thực sự nên để lại cho trình quản lý gói của hệ thống (ví dụ như apttrong Debian / Ubuntu). Tốt hơn hết là đừng gây rối với điều này, điều này dẫn đến rất nhiều vấn đề. Nếu một gói Python cần có sẵn cho tất cả người dùng, thì hãy sử dụng trình quản lý gói của hệ điều hành, nhưng không được sudo pip install .... Một thay thế là sudo pip install --target .... Trên Windows thì ít vấn đề hơn.
sinoroc

Được rồi - ý bạn là nửa sau của dấu đầu dòng cuối cùng trong phần 'không có môi trường ảo'? Nếu không, phần cụ thể nào? (vui lòng chỉnh sửa trực tiếp cho bản cập nhật này, tôi chủ yếu không phải là người dùng * nix)
LightCC

Tôi thấy, nếu bạn không sử dụng Windows, thì thực sự không có gì đáng lo ngại vì nó thực sự không có trình quản lý gói tập trung, trừ khi bạn bắt đầu sử dụng một cái gì đó như nuget . Tôi sẽ xem nếu tôi đến để chỉnh sửa câu trả lời của bạn.
sinoroc

@sinoroc Tôi đã thêm một ghi chú cho đoạn đó. Vui lòng cập nhật nó để chính xác hơn, v.v. hoặc chỉnh sửa ở nơi khác nếu tôi có từ ngữ tương tự.
LightCC

1

Tại sao không đặt một thực thi ở đâu đó trong $ PATH của tôi

~/.local/bin directoryvề mặt lý thuyết dự kiến ​​sẽ ở trong của bạn $PATH.

Theo những người này, đó là một lỗi không thêm vào $PATHkhi sử dụng systemd.

Câu trả lời này giải thích nó rộng rãi hơn.

Nhưng ngay cả khi distro của bạn bao gồm các ~/.local/binthư mục vào$PATH , nó có thể là trong các hình thức sau (bên trong ~/.profile):

if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

sẽ yêu cầu bạn đăng xuất và đăng nhập lại , nếu thư mục không có ở đó trước đó.

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.