Apa tujuan dari "pip install --user ..."?

189

Dari 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.)

Dokumentasi untuk situs.USER_BASE adalah lubang cacing yang mengerikan dari materi * NIX menarik yang tidak saya mengerti.

Apa tujuan dari --userbahasa Inggris biasa? Mengapa intalling paket menjadi ~/.local/penting? Mengapa tidak meletakkan executable di suatu tempat di $ PATH saya?

Rob Truxal
sumber
2
Anda dapat import site; print site.USER_SITEmencetak lokasi pemasangan. Bagi saya, saya mengerti /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages.
Trevor Boyd Smith
1
Pada mesin host, /usr/local/lib/pythonX.X/dist-packagesadalah direktori default untuk paket yang diinstal oleh pip . Tetapi jika satu pengguna ingin menginstal paket khusus pengguna, mereka dapat menggunakannya $ sudo pip3 --user install some_package. Paket itu akan tetap tidak tersedia untuk grup dan orang lain yang mengakses host itu.
noobninja

Jawaban:

223

pip default untuk menginstal paket Python ke direktori sistem (seperti /usr/local/lib/python3.4). Ini membutuhkan akses root.

--user jadikan paket instalasi pip di direktori home Anda, yang tidak memerlukan hak khusus.

duskwuff -inactive-
sumber
1
Terima kasih; itu masuk akal. Tetapi apakah intinya --useruntuk memastikan bahwa seseorang tidak menjalankan paket sebagai root? (Saya membayangkan sesuatu yang mirip dengan opsi Wireshark / kismet / burpsuite untuk membuat kebijakan akses grup, sehingga tidak mengizinkan semua fitur program berjalan sebagai root. Apakah itu di jalur yang benar?) Atau apakah --useropsi itu hanya dimaksudkan untuk mengizinkan instalasi tanpa hak root? Jika itu masalahnya, mengapa saya tidak pernah menggunakan sudo pip install foo_package? Saya tidak pernah membutuhkan root-privelage untuk diinstal melalui pip sebelumnya.
Rob Truxal
12
@Rob Truxal. Saya pikir intinya adalah bahwa paket tersebut tidak akan dilihat oleh pengguna lain. Mungkin Anda menginginkan versi yang lebih lama / lebih baru dari sebuah paket, tetapi jika Anda menginstalnya pada sistem, Anda akan membuat kesalahan rekan kerja.
NDEthos
4
oh! The --userparam adalah tentang pengguna-isolasi! Itu seperti ammt akal yang tidak masuk akal. Terima kasih @NDEthos!
Rob Truxal
ok di sini adalah (noobish) pertanyaan: misalkan saya login sebagai pengguna foo, dan kemudian saya menjalankan perintah ini pip install --user -r requirement.txt .. dan semuanya terpasang dengan baik. Kemudian saya login sebagai bilah pengguna, dan menjalankan program python seperti: sudo -u foo ./odoo-bin .. apakah itu akan dibaca dari paket python yang diinstal untuk pengguna foo? atau bagaimana cara kerjanya?
abbood
1
juga adakah cara untuk mendaftar hanya paket yang diinstal untuk pengguna saat ini? yaitu sesuatu seperti pip freeze --user?
abbood
24

--usermenginstal di site.USER_SITE.

Untuk kasus saya, itu /Users/.../Library/Python/2.7/bin. Jadi saya telah menambahkan itu ke PATH saya (dalam ~/.bash_profilefile):

export PATH=$PATH:/Users/.../Library/Python/2.7/bin
Roozbeh Zabihollahi
sumber
15

Jawaban lain menyebutkan site.USER_SITEtempat paket Python ditempatkan. Jika Anda mencari binari, ini masuk {site.USER_BASE}/bin.

Jika Anda ingin menambahkan direktori ini ke jalur pencarian shell Anda, gunakan:

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

Hanya peringatan:

Menurut masalah ini , --usersaat ini tidak valid di dalam virtual env's pip, karena lokasi pengguna tidak benar-benar masuk akal untuk lingkungan virtual.

Jadi jangan gunakan pip install --user some_pkg di dalam lingkungan virtual , jika tidak, lingkungan virtual pipakan bingung. Lihat jawaban ini untuk lebih jelasnya.

YaOzI
sumber
11

Cara terbaik adalah menginstal virtualenvdan tidak memerlukan --userkebingungan. Anda akan mendapatkan lebih banyak fleksibilitas dan tidak perlu khawatir mengenai berbagai versi dan proyek python yang berbeda setiap kali Anda memasang paket.

https://virtualenv.pypa.io/en/stable/

pengguna603749
sumber
8

Di macOS, alasan untuk menggunakan --userflag adalah untuk memastikan kami tidak merusak pustaka yang diandalkan OS. Sebuah konservatif pendekatan untuk pengguna banyak MacOS adalah untuk menghindari menginstal atau memperbarui pip dengan perintah yang membutuhkan sudo. Dengan demikian, ini termasuk menginstal ke /usr/local/bin...

Ref: Menginstal python untuk Neovim ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

Saya tidak semua jelas mengapa menginstal ke /usr/local/bindalam risiko pada Mac mengingat fakta bahwa sistem hanya bergantung pada python biner di /Library/Frameworks/dan /usr/bin. Saya menduga itu karena seperti yang disebutkan di atas, menginstal ke dalam /usr/local/binmengharuskan sudoyang membuka pintu untuk membuat kesalahan mahal dengan perpustakaan sistem. Jadi, memasang ke ~/.local/binadalah cara yang pasti untuk menghindari risiko ini.

Ref: Menggunakan python di Mac ( https://docs.python.org/2/using/mac.html )

Akhirnya, pada tingkat ada manfaat menginstal paket ke /usr/local/bin, saya ingin tahu apakah masuk akal untuk mengubah pemilik direktori dari rootke user? Ini akan menghindari keharusan menggunakan sudosambil tetap melindungi dari melakukan perubahan yang bergantung pada sistem. * Apakah ini default keamanan peninggalan tentang bagaimana sistem Unix lebih sering digunakan di masa lalu (sebagai server)? Atau minimal, hanya cara yang baik untuk pengguna Mac yang tidak meng-hosting server?

* Catatan: Fitur Perlindungan Integritas Sistem (SIP) Mac juga tampaknya melindungi pengguna dari perubahan pustaka yang bergantung pada sistem.

- E

Edmund's Echo
sumber
8

Tanpa Lingkungan Virtual

pip <command> --user mengubah ruang lingkup perintah pip saat ini untuk bekerja pada lokasi pemasangan paket python lokal akun pengguna saat ini, daripada lokasi pemasangan paket seluruh sistem, yang merupakan default.

Ini hanya penting pada mesin multi-pengguna. Apa pun yang diinstal ke lokasi sistem akan terlihat oleh semua pengguna, jadi menginstal ke lokasi pengguna akan membuat instalasi paket terpisah dari pengguna lain (mereka tidak akan melihatnya, dan harus menginstalnya sendiri secara terpisah untuk menggunakannya). Karena mungkin ada konflik versi, menginstal paket dengan dependensi yang dibutuhkan oleh paket lain dapat menyebabkan masalah, jadi sebaiknya jangan mendorong semua paket yang digunakan pengguna ke lokasi pemasangan sistem.

  • Jika itu adalah mesin satu pengguna, ada sedikit atau tidak ada perbedaan untuk menginstal ke --userlokasi. Ini akan diinstal ke folder yang berbeda, yang mungkin atau mungkin tidak perlu ditambahkan ke path, tergantung pada paket dan bagaimana itu digunakan (banyak paket menginstal alat baris perintah yang harus di path untuk menjalankan dari shell) .
  • Jika ini adalah mesin multi-pengguna, --userlebih disukai menggunakan root / sudo atau membutuhkan instalasi administrator dan memengaruhi lingkungan Python setiap pengguna, kecuali dalam kasus paket umum yang ingin disediakan administrator untuk semua pengguna secara default.
    • Catatan: Per komentar, pada sebagian besar pemasangan Unix / Linux telah ditunjukkan bahwa pemasangan sistem harus menggunakan manajer paket umum, seperti apt, daripada pip.

Dengan Lingkungan Virtual

The --userpilihan di lingkungan venv / virtualenv aktif akan menginstal ke lokasi pengguna python lokal (sama seperti tanpa lingkungan virtual).

Paket diinstal ke lingkungan virtual secara default, tetapi jika Anda menggunakannya --userakan memaksanya untuk menginstal di luar lingkungan virtual, di direktori skrip python pengguna (di Windows, saat ini c:\users\<username>\appdata\roaming\python\python37\scriptsuntuk saya dengan Python 3.7).

Namun, Anda tidak akan dapat mengakses instalasi sistem atau pengguna dari dalam lingkungan virtual (bahkan jika Anda menggunakannya --usersaat berada di lingkungan virtual).

Jika Anda menginstal lingkungan virtual dengan --system-site-packagesargumen, Anda akan memiliki akses ke folder skrip sistem untuk python. Saya percaya ini termasuk folder skrip python pengguna juga, tapi saya tidak yakin. Namun, mungkin ada konsekuensi yang tidak diinginkan untuk ini dan itu bukan cara yang dimaksudkan untuk menggunakan lingkungan virtual.


Lokasi Sistem Python dan Folder Instal Pengguna Lokal

Anda dapat menemukan lokasi folder instal pengguna untuk python python -m site --user-base. Saya menemukan informasi yang saling bertentangan dalam Tanya Jawab, dokumentasi dan sebenarnya menggunakan perintah ini pada PC saya tentang apa defaultnya, tetapi mereka berada di bawah direktori home pengguna ( ~pintasan di * nix, dan c:\users\<username>biasanya untuk Windows).


Detail lainnya

The --userpilihan adalah tidak berlaku untuk setiap perintah. Misalnya pip uninstallakan menemukan dan menghapus paket di mana pun mereka diinstal (di folder pengguna, folder lingkungan virtual, dll.) Dan --useropsi tidak valid.

Hal-hal yang terinstal dengan pip install --userakan dipasang di lokasi lokal yang hanya akan terlihat oleh akun pengguna saat ini, dan tidak akan memerlukan akses root (pada * nix) atau akses administrator (pada Windows).

The --usermemodifikasi pilihan semua pip perintah yang menerimanya untuk melihat / beroperasi pada pengguna menginstal folder, jadi jika Anda menggunakan pip list --useritu akan hanya menunjukkan paket apa diinstal dengan pip install --user.

LightCC
sumber
1
Apakah Anda mempertimbangkan untuk mengulangi bagian pertama? Di luar lingkungan virtual Python yang terbaik adalah menghindari menggunakan pip installtanpa --usersepenuhnya. Ini akan menginstal paket Python di tempat-tempat yang benar-benar harus diserahkan kepada manajer paket sistem (misalnya aptdi Debian / Ubuntu). Lebih baik tidak main-main dengan ini, ini menyebabkan banyak masalah. Jika paket Python perlu tersedia untuk semua pengguna, maka gunakan manajer paket sistem operasi, tetapi jangan lakukan sudo pip install .... Alternatifnya adalah sudo pip install --target .... Pada Windows, ini bukan masalah.
sinoroc
Oke - maksud Anda bagian kedua dari poin terakhir di bagian 'tanpa lingkungan virtual'? Jika tidak, bagian mana yang spesifik? (jangan ragu untuk mengeditnya langsung untuk pembaruan ini, saya bukan pengguna * nix)
LightCC
Saya tahu, jika Anda tidak menggunakan Windows, maka itu jauh dari masalah memang karena tidak benar-benar memiliki manajer paket terpusat, kecuali jika Anda mulai menggunakan sesuatu seperti nuget . Saya akan melihat apakah saya datang untuk mengedit jawaban Anda.
sinoroc
@ sinoroc Saya menambahkan Catatan ke paragraf itu. Jangan ragu untuk memperbaruinya menjadi lebih tepat, dll., Atau mengedit di tempat lain jika saya memiliki kata-kata yang serupa.
LightCC
1

Mengapa tidak meletakkan saja executable di suatu tempat di $ PATH saya

~/.local/bin directorysecara teoritis diharapkan berada di blog Anda $PATH.

Menurut orang-orang ini adalah bug yang tidak menambahkannya $PATHsaat menggunakan systemd.

Jawaban ini menjelaskannya lebih luas.

Tapi bahkan jika distro Anda termasuk yang ~/.local/bindirektori ke$PATH , mungkin dalam bentuk berikut (dalam ~/.profile):

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

yang mengharuskan Anda untuk keluar dan masuk lagi , jika direktori itu tidak ada sebelumnya.

Jannis Ioannou
sumber