「pip install --user…」の目的は何ですか?


189

から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のドキュメントは、私が理解できない興味深い* NIX主題の恐ろしいワームホールです。

--userわかりやすい英語での目的は何ですか?なぜパッケージを~/.local/問題にするのですか?$ PATHのどこかに実行可能ファイルを置いてみませんか?


2
import site; print site.USER_SITEインストール場所を印刷できます。私にとっては/${HOME}/.local/lib/python${PY_MAJOR}.${PY_MINOR}/site-packages
Trevor Boyd Smith、

1
ホストマシンで/usr/local/lib/pythonX.X/dist-packagesは、はpipによってインストールされるパッケージのデフォルトディレクトリです。ただし、1人のユーザーがユーザー固有のパッケージをインストールする場合は、を使用できます$ sudo pip3 --user install some_package。そのパッケージは、そのホストにアクセスするグループや他のユーザーには引き続き利用できません。
noobninja

回答:


223

pipはデフォルトでPythonパッケージをシステムディレクトリ(など/usr/local/lib/python3.4)にインストールします。これにはrootアクセスが必要です。

--user 代わりに、ホームディレクトリにpipインストールパッケージを作成します。特別な権限は必要ありません。


1
ありがとう。それは理にかなっている。しかし--user、パッケージをrootとして実行しないことを確認することがポイントですか?(私は、グループアクセスポリシーを設定するには、Wiresharkの/運命/ burpsuiteオプションのように似たものを想像し、それによって、すべてのプログラム-ますrootとして実行するを許可していません。正しい軌道上のことですか?よ)以上である--userだけで意味のオプションroot権限なしでインストールを許可するには?その場合は、なぜ使用しないのsudo pip install foo_packageですか?これまでに、pipを使用してインストールするためにroot権限を必要としませんでした。
Rob Truxal

12
@Rob Truxal。ポイントは、パッケージが他のユーザーに表示されないことです。おそらく、パッケージの古いバージョンまたは新しいバージョンが必要ですが、それをシステムにインストールすると、作業仲間を汚すことになります。
NDEthos

4
ああ!--userparamがユーザ分離についてです!それはとんでもない感覚のようです。@NDEthosに感謝!
Rob Truxal

さて、ここに(おろか)の質問があります。ユーザーfooとしてログインし、このコマンドpip install --user -r requirements.txt ..を実行したとします。次に、ユーザーbarとしてログインし、次のようにpythonプログラムを実行しました。sudo -u foo ./odoo-bin .. fooユーザー用にインストールされたpythonパッケージから読み取りますか?またはそれはどのように機能しますか?
abbood

1
また、現在のユーザーにインストールされているパッケージのみを一覧表示する方法はありますか?すなわち何かpip freeze --user
abbood

24

--userにインストールしsite.USER_SITEます。

私の場合、それはでした/Users/.../Library/Python/2.7/bin。だから私はそれを自分のPATHに(~/.bash_profileファイルで)追加しました:

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

15

他の回答はsite.USER_SITE、Pythonパッケージが配置される場所として言及しています。バイナリを探している場合、これらはに含まれ{site.USER_BASE}/binます。

このディレクトリをシェルの検索パスに追加する場合は、次を使用します。

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

14

ただの警告:

この問題によると、ユーザーの場所は仮想環境に対して実際には意味をなさないため、仮想環境--user内では現在有効でpipはありません。

したがってpip install --user some_pkg 、仮想環境内では使用しないpipでください。使用すると、仮想環境が混乱します。詳細については、この回答を参照してください。


11

最善の方法はインストールvirtualenvであり、--user混乱を必要としない。パッケージをpipインストールするたびに、より多くの柔軟性が得られ、異なるバージョンのpythonとプロジェクトを壊す心配がなくなります。

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


8

macOSでは、--userフラグを使用する理由は、OSが依存するライブラリを破損しないようにするためです。保守的な多くのMacOSのユーザーのためのアプローチが必要とするコマンドでPIPをインストールまたは更新を回避することですsudo。したがって、これには/usr/local/bin... へのインストールが含まれます

参照:Neovim用のpythonのインストール(https://github.com/zchee/deoplete-jedi/wiki/Setting-up-Python-for-Neovim

私はないんだけど、すべてにインストールする理由を明確に/usr/local/binシステムだけでPythonのバイナリに依存しているという事実与えMac上のリスクである/Library/Frameworks//usr/bin。上で述べたように、intoをインストールすること/usr/local/binsudo、システムライブラリでコストのかかる間違いをするドアを開くためだと思います。したがって、へのインストール~/.local/binは、このリスクを回避するための確実な方法です。

参照:Macでのpythonの使用(https://docs.python.org/2/using/mac.html

最後に、パッケージをにインストールする利点がある程度/usr/local/binまで、ディレクトリの所有者をからに変更するのは理にかなっrootているのuserでしょうか。 これによりsudo、システムに依存する変更を加えないように保護しながら、を使用する必要がなくなります。*これはセキュリティのデフォルトですか(サーバーとして)以前にUNIXシステムがより頻繁に使用された方法の遺物ですか?または、最低限、サーバーをホストしていないMacユーザーのための良い方法は何ですか?

*注意:Macのシステム整合性保護(SIP)機能も、システムに依存するライブラリの変更からユーザーを保護しているようです。

-E


8

仮想環境なし

pip <command> --user デフォルトのシステム全体のパッケージインストール場所ではなく、現在のユーザーアカウントのローカルpythonパッケージインストール場所で機能するように現在のpipコマンドのスコープを変更します。

これは、マルチユーザーマシンでのみ重要です。システムの場所にインストールされたものはすべてのユーザーに表示されるため、ユーザーの場所にインストールすると、そのパッケージのインストールが他のユーザーから分離されます(ユーザーには表示されず、使用するために個別にインストールする必要があります)。バージョンの競合が発生する可能性があるため、他のパッケージに必要な依存関係を持つパッケージをインストールすると問題が発生する可能性があるため、特定のユーザーが使用するすべてのパッケージをシステムのインストール場所にプッシュしないことをお勧めします。

  • シングルユーザーマシンの場合、その--user場所へのインストールに違いはほとんどありません。パッケージとその使用方法に応じて、パスに追加する必要があるかどうかに関係なく、別のフォルダーにインストールされます(多くのパッケージは、シェルから実行するためにパス上になければならないコマンドラインツールをインストールします)。 。
  • マルチユーザーマシンの場合、--userroot / sudoを使用するか、管理者によるインストールを要求し、すべてのユーザーのPython環境に影響を与えるよりも優先されます。ただし、管理者がデフォルトですべてのユーザーが利用できるようにする一般的なパッケージの場合は除きます。
    • 注: コメントごと、ほとんどのUnix / Linux上で、システムのインストールのような、一般的なパッケージマネージャを使用する必要があることが指摘されているインストールaptではなく、pip

仮想環境で

--userアクティブなvenv / virtualenv環境のオプションは、ローカルユーザーのpythonの場所にインストールされます(仮想環境がない場合と同じ)。

パッケージはデフォルトで仮想環境にインストールされますが、使用--userすると、仮想環境外のユーザーのpythonスクリプトディレクトリに強制的にインストールされます(Windowsでは、これは現在のところc:\users\<username>\appdata\roaming\python\python37\scriptsPython 3.7を使用しています)。

ただし、仮想環境内からシステムまたはユーザーインストールにアクセスすることはできません(仮想環境で使用--userしていた場合でも)。

--system-site-packages引数を指定して仮想環境をインストールすると、Pythonのシステムスクリプトフォルダーにアクセスできます。これにはユーザーのpythonスクリプトフォルダーも含まれていると思いますが、よくわかりません。ただし、これには意図しない結果が生じる可能性があり、仮想環境を使用する意図された方法ではありません。


Pythonシステムとローカルユーザーインストールフォルダーの場所

Pythonのユーザーインストールフォルダーの場所は、で確認できますpython -m site --user-base。Q&A、ドキュメントで矛盾する情報を見つけて、デフォルトでこのコマンドを私のPCで実際に使用していますが、それらはユーザーのホームディレクトリ(~* nixのショートカット、c:\users\<username>通常はWindows)の下にあります。


その他の詳細

この--userオプションは、すべてのコマンドに有効なわけではありません。たとえば、pip uninstallパッケージがインストールされている場所(ユーザーフォルダー、仮想環境フォルダーなど)にあるパッケージを見つけてアンインストールし、--userオプションは無効です。

とともにpip install --userインストールされるものは、現在のユーザーアカウントからのみ表示されるローカルの場所にインストールされ、rootアクセス(* nixの場合)または管理者アクセス(Windowsの場合)を必要としません。

この--userオプションは、それを受け入れるすべての pipコマンドを変更して、ユーザーインストールフォルダーを表示/操作するため、使用pip list --userすると、インストールされたパッケージのみが表示されpip install --userます。


1
最初の部分を言い換えることを検討しますか?Python仮想環境の外ではpip install--user完全に使用せずに使用するのを避けるのが本当に最善です。これにより、システムのパッケージマネージャー(aptDebian / Ubuntuなど)に任せる必要のある場所にPythonパッケージがインストールされます。これを台無しにしない方がいいです。これは非常に多くの問題を引き起こします。すべてのユーザーがPythonパッケージを使用できるようにする必要がある場合は、オペレーティングシステムのパッケージマネージャーを使用しますが、使用しないでくださいsudo pip install ...。代替はsudo pip install --target ...です。Windowsでは、それほど問題ではありません。
sinoroc

わかりました-「仮想環境なし」セクションの最後の箇条書きの後半を意味しますか?そうでない場合、どの特定の部品ですか?(このアップデートのために直接編集しても
かまい

Windowsを使用していなくても、nugetのようなものを使い始めない限り、集中型のパッケージマネージャーが実際にはないので、それほど心配する必要はありません。私があなたの答えを編集するために来たかどうかを確認します。
sinoroc

@sinorocその段落にメモを追加しました。より正確になるように更新するか、似たような表現がある場合は他の場所で編集してください。
LightCC、2019年

1

$ PATHのどこかに実行可能ファイルを配置しないのはなぜですか

~/.local/bin directory理論的にはにあると予想されます$PATH

これらの人々 よるとそれ$PATHを使用するときにそれを追加しないバグsystemdです。

この答えはそれをより広範囲に説明します。

ただし、ディストリビューションにへのディレクトリ含まれている場合でも、次の形式(内部)になる可能性があります。~/.local/bin$PATH~/.profile

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

ディレクトリが以前になかった場合、ログアウトして再度ログインする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.