“Pip install --user…” nin amacı nedir?


189

Gönderen 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.)

Site.USER_BASE belgeleri, anlamadığım ilginç * NIX konusunun korkunç bir solucanı.

--userSade ingilizcenin amacı nedir ? Paketi neden ~/.local/önemli hale getirsin ? Neden sadece $ PATH'ımda bir yere yürütülebilir dosya koymuyoruz?


2
yapabilecekleriniz import site; print site.USER_SITEyükleme konumu yazdırmak için. Benim için aldım /${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages.
Trevor Boyd Smith

1
Ana makinede, pip/usr/local/lib/pythonX.X/dist-packages tarafından kurulan paketler için varsayılan dizindir . Ancak bir kullanıcı kullanıcıya özel paketler yüklemek isterse kullanabilir . Bu paket, gruplar ve o ana bilgisayara erişen diğer kullanıcılar tarafından kullanılamayacak. $ sudo pip3 --user install some_package
19:32 noobninja

Yanıtlar:


223

pip varsayılan olarak Python paketlerini bir sistem dizinine (örneğin /usr/local/lib/python3.4) yüklemektir . Bu, root erişimi gerektirir.

--user bunun yerine pip install paketlerini ana dizininizde yapar, bu da herhangi bir özel ayrıcalık gerektirmez.


1
Teşekkürler; mantıklı. Ancak, --userpaketin root olarak çalışmadığından emin olmanın amacı nedir? Olduğu ya da (I Wireshark / kısmet / burpsuite seçenekleri böylece program özellikleri tüm yönetici olarak çalıştırma izin vermeyerek., Grup erişim ilkelerini kurmak gibi benzer bir şey hayal ediyorum? Doğru yolda mı) --userseçeneği, sadece geliyordu için izin kök ayrıcalıkları olmadan kurulum? Bu durumda neden hiç kullanmıyorum sudo pip install foo_package? Daha önce pip yoluyla kurmak için root-privelages'e hiç ihtiyacım olmadı.
Rob Truxal

12
@Rob Truxal. Bence bu paket diğer kullanıcılar tarafından görülmeyecek. Belki bir paketin daha eski / daha yeni bir sürümünü istersiniz, ancak sisteme yüklerseniz, çalışma arkadaşlarınızı emeceksiniz.
NDEthos

4
ah! --userParam kullanıcı izolasyonu hakkında! Bu saçma bir anlam ifade ediyor. Teşekkürler @NDEthos!
Rob Truxal

Tamam burada (noobish) bir soru: varsayalım ben kullanıcı foo olarak giriş ve sonra bu komut pip install - kullanıcı -r gereksinimleri.txt .. ve her şey gayet iyi yüklü. Sonra kullanıcı çubuğu olarak giriş yaptı ve python programını şöyle çalıştırdı: sudo -u foo ./odoo-bin .. foo kullanıcısı için kurulmuş olan python paketlerinden okuyacak mı? veya bu nasıl çalışır?
abbood

1
ayrıca yalnızca geçerli kullanıcı için yüklenen paketleri listelemenin bir yolu var mı? yani bir şey pip freeze --user?
abbood

24

--user yükler site.USER_SITE .

Benim durumum için öyleydi /Users/.../Library/Python/2.7/bin. Bu yüzden PATH dosyama ekledim ( ~/.bash_profiledosyada):

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

15

Diğer cevaplar site.USER_SITEPython paketlerinin nereye yerleştirildiğinden bahsediyor . İkili dosyalar arıyorsanız, bunlar içeri girer {site.USER_BASE}/bin.

Bu dizini kabuğunuzun arama yoluna eklemek istiyorsanız, şunu kullanın:

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

14

Sadece bir uyarı:

Bu konuya göre , --userşu anda bir sanal env'ler içinde geçerli değilpip sanal bir ortamın , çünkü bir kullanıcı konumu sanal bir ortam için gerçekten mantıklı değildir.

Bu nedenle pip install --user some_pkg sanal bir ortamda kullanmayın , aksi takdirde sanal ortamların pipkafası karışır. Daha fazla ayrıntı için bu cevaba bakınız.


11

En iyi yol yüklemek virtualenvve --userkarışıklık gerektirmez . Daha fazla esneklik elde edeceksiniz ve her paket kuruşunuzda farklı python sürümlerini ve projelerini zorlamaktan endişe etmeyeceksiniz.

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


8

MacOS'ta, --userbayrağı kullanmanın nedeni , işletim sisteminin dayandığı kütüphaneleri bozmadığımızdan emin olmaktır. Bir muhafazakar birçok MacOS kullanıcıları için yaklaşım yükleme veya gerektiren bir komutla pip güncellenmesi kaçınmaktır sudo. Böylece, bu/usr/local/bin ...

Ref: Neovim için python kurulumu ( https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim )

Ben değilim hepsi içine yüklerken neden temizlemek /usr/local/binsistemi sadece piton çiftlerin alır hale geldiğini verilen Mac'te bir risktir /Library/Frameworks/ve /usr/bin. Bunun yukarıda belirtildiği gibi, sistem kütüphanelerinde maliyetli bir hata yapma kapısını açan /usr/local/bingereksinimlere kurulumdan şüpheleniyorum sudo. Böylece, içine yükleme~/.local/bin bu riski önlemek için kesin bir yangın yoludur.

Ref: Mac'te python kullanma ( https://docs.python.org/2/using/mac.html )

Son olarak, bir dereceye kadar içine paketleri yükleyerek bir faydası yoktur /usr/local/binondan dizinin sahibini değiştirmek mantıklı eğer, acaba roothiç user? Bu, sudosisteme bağlı değişiklikler yapmaya karşı koruma sağlarken kullanmak zorunda kalmaz. * Bu bir güvenlik varsayılanı, Unix sistemlerinin geçmişte (sunucu olarak) daha sık nasıl kullanıldığının bir kalıntısı mıdır? Ya da en azından, sunucu barındırmayan Mac kullanıcıları için iyi bir yol mu?

* Not: Mac'in Sistem Bütünlüğü Koruması (SIP) özelliği de kullanıcıyı sisteme bağlı kitaplıkları değiştirmeye karşı korur.

- E


8

Sanal Ortamlar Olmadan

pip <command> --user geçerli sistem komutunun kapsamını, varsayılan olarak sistem genelinde paket yükleme konumu yerine geçerli kullanıcı hesabının yerel python paketi yükleme konumunda çalışacak şekilde değiştirir.

Bu sadece çok kullanıcılı bir makinede önemlidir. Sistem konumuna yüklenen her şey tüm kullanıcılar tarafından görülebilir, bu nedenle kullanıcı konumuna yükleme, paket yüklemesini diğer kullanıcılardan ayrı tutar (görmezler ve kullanmak için ayrı ayrı yüklemeleri gerekir). Sürüm çakışmaları olabileceğinden, diğer paketlerin ihtiyaç duyduğu bağımlılıklara sahip bir paket yüklemek sorunlara neden olabilir, bu nedenle belirli bir kullanıcının kullandığı tüm paketleri sistem yükleme konumuna zorlamamak en iyisidir.

  • Tek kullanıcılı bir makineyse, makineye takmak için çok az veya hiç fark yoktur. --user konuma . Pakete ve nasıl kullanıldığına bağlı olarak yola eklenmesi gerekebilecek veya olmayabilecek farklı bir klasöre yüklenecektir (birçok paket bir kabuktan çalıştırmak için yolda olması gereken komut satırı araçlarını yükler) .
  • Çok kullanıcılı bir makine --userise, yöneticinin varsayılan olarak tüm kullanıcılara sunmak istediği genel paketler haricinde, root / sudo kullanmak veya yönetici kurulumu gerektirmek ve her kullanıcının Python ortamını etkilemek tercih edilir.
    • Not: Yorumlar Per, çoğunda Unix / Linux sistem yüklemeleri gibi, genel paket yöneticisini kullanması gerektiğini işaret edilmiştir yükler aptziyade, pip.

Sanal Ortamlarla

--userAktif bir venv / Virtualenv ortamında seçenek yerel kullanıcı piton konumu (sanal ortamda olmadan aynı) için yükler.

Paketler sanal ortama varsayılan olarak yüklenir, ancak kullanırsanız --user, sanal ortamların dışında, kullanıcıların python komut dosyası dizinine yüklemeye zorlar (Windows'ta, bu c:\users\<username>\appdata\roaming\python\python37\scriptsbenim için Python 3.7 ile).

Ancak, bir sisteme veya kullanıcı kurulumuna sanal ortam içinden erişemezsiniz (sanal bir ortamdayken kullansanız bile --user).

Bağımsız --system-site-packagesdeğişkeni olan bir sanal ortam yüklerseniz , python için sistem komut dosyası klasörüne erişebilirsiniz. Bu da kullanıcı python komut dosyası klasörü dahil inanıyorum, ama emin değilim. Bununla birlikte, bunun istenmeyen sonuçları olabilir ve sanal ortamları kullanmanın amaçlanan yolu değildir.


Python Sisteminin Konumu ve Yerel Kullanıcı Yükleme Klasörleri

İle python için kullanıcı yükleme klasörünün konumunu bulabilirsiniz python -m site --user-base. Q & A, belgelerde çakışan bilgiler buluyorum ve aslında bu komutu bilgisayarımda varsayılanların ne olduğuna göre kullanıyorum, ancak kullanıcı ana dizininin altında ( ~* nix'te kısayol ve c:\users\<username>genellikle Windows için).


Diğer detaylar

Bu --userseçenek her komut için geçerli değildir. Örneğin pip uninstall, yüklendikleri her yerde (kullanıcı klasöründe, sanal ortam klasöründe vb.) Paketleri bulur ve kaldırır ve --userseçenek geçerli değildir.

İle yüklenen şeyler pip install --user, yalnızca geçerli kullanıcı hesabı tarafından görülecek ve kök erişimi (* nix'te) veya yönetici erişimi (Windows'ta) gerektirmeyecek yerel bir konuma yüklenir.

--userSeçenek değiştirir tüm pip görmek onu kabul komutları / kullanıcı üzerinde işlem kullanmak eğer öyleyse, klasör yüklemek pip list --usero olacak sadece sizinle yüklü paketleri göster pip install --user.


1
İlk kısmı yeniden yazmayı düşünür müsünüz? Dışında bir Python sanal ortamın gerçekten kullanmaktan kaçınmak en iyisidir pip installolmadan --usertamamen. Bu, Python paketlerini gerçekten sistemin paket yöneticisine bırakılması gereken yerlere kurar (örneğin aptDebian / Ubuntu'da). Bununla uğraşmamak daha iyidir, bu çok fazla soruna yol açar. Bir Python paketinin tüm kullanıcılar tarafından kullanılabilir olması gerekiyorsa, işletim sisteminin paket yöneticisini kullanın, ancak kullanmayın sudo pip install .... Bir alternatif sudo pip install --target .... Windows'da sorun daha azdır.
sinoroc

Tamam - 'sanal ortamlar olmadan' bölümündeki son kurşun noktasının ikinci yarısını mı kastediyorsunuz? Değilse, hangi spesifik parçalar? (bu güncelleme için doğrudan düzenleme yapmaktan çekinmeyin, ben öncelikle * nix kullanıcısı değilim)
LightCC

Eğer Windows kullanmıyorsanız, nuget gibi bir şey kullanmaya başlamadığınız sürece gerçekten merkezi bir paket yöneticisine sahip olmadığı için gerçekten daha az endişe duyuyor . Cevabınızı düzenlemek için gelip gelmediğimi göreceğim.
sinoroc

@sinoroc Bu paragrafa bir Not ekledim. Daha kesin, vb. Olacak şekilde güncellemekten çekinmeyin veya benzer ifadelerim varsa başka bir yerde düzenleyin.
LightCC

1

Neden sadece $ PATH'ımda bir yere yürütülebilir dosya koymuyoruz?

~/.local/bin directoryteorik olarak senin içinde olması bekleniyor $PATH.

Bu insanlara göre kullanırken kullanırken eklemeyen bir hata .$PATHsystemd

Bu cevap daha kapsamlı bir şekilde açıklıyor.

Ama olsa bile senin dağıtıma dahil~/.local/bin dizini için$PATH , bu şu formu (iç kalmış olabilir ~/.profile):

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

dizin daha önce olmasa da oturumu kapatıp tekrar oturum açmanızı gerektirir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.