webdevqa.jp.net

--userを--prefixエラーとsetup.py installで結合します

Python最近アクセスしたシステムにPython $ ===パッケージをインストールしようとしました。Pythonの比較的新しい ユーザーサイトパッケージディレクトリごと を利用しようとしていました。新しいオプション_--user_。(オプションは 現在は文書化されていません ですが、Python 2.6+の場合に存在します。_python setup.py install --help_。)

走ってみたとき

_python setup.py install --user
_

ダウンロードしたパッケージで、常に次のエラーが発生しました。

_error: can't combine user with with prefix/exec_prefix/home or install_(plat)base
_

ご覧のとおり、コマンドラインオプションとして_--prefix_、_--exec-prefix_、_--install-base_、または_--install-platbase_フラグを指定していないため、エラーは非常に困惑していました。私は問題が何であるかを理解しようとして多くの時間を無駄にしました。数時間の yak shaving で他の貧しい人々の魂を救いたいと思って、以下に私の答えを文書化します。

92
gotgenes

一時的な回避策:

pip install --user --install-option="--prefix=" <package_name>

または

python setup.py install --user --prefix=

=の後にテキストはない(空白でもない)ことに注意してください。

--userフラグを忘れないでくださいnot

複数のパッケージのインストール:

次の内容で~/.pydistutils.cfg(またはOS /プラットフォームに相当するもの)を作成します。

[install]
prefix=

=の後にテキストはない(空白でもない)ことに注意してください。

次に、必要なpip install --userまたはpython setup.py install --userコマンドを実行します。 --userフラグを忘れないでくださいnot

最後に、このファイルを削除するか、名前を変更します。このファイルを残しておくと、この--userを持つこのユーザーとしてPythonパッケージをシステム全体に(つまり、~/.pydistutils.cfgなし)]インストールするときに問題が発生します。

この問題の原因

これは、OpenSUSEとRedHatの両方の問題であると思われ、これらのプラットフォームでは virtualenvのバグ につながります。

このエラーは、システムレベル distutils構成ファイル (私の場合は/usr/lib64/python2.6/distutils/distutils.cfg)が原因で発生しました

[install]
prefix=/usr/local

基本的に、これは常にinstall --prefix=/usr/localとしてインストールコマンドを実行するのと同じです。上記の手法のいずれかを使用して、この仕様をオーバーライドする必要があります。

145
gotgenes

コメントで指摘されているように、受け入れられた答え(おそらく遺伝子を持っている@gotgenesによる)は、予期しない結果につながる可能性があります。

@rogeleaderr氏は、「このファイルをこのように保持すると、Python /があなたのルートであると考えられることに注意してくださいpython他の新しいパッケージをインストールします。」

@gotgenesが推奨しているように、新しい構成ファイルを作成するよりも、--prefix=(等号の右側にテキストがない)コマンドラインのオプションとして

$ python setup.py install --user --prefix=
5
dbliss

利用可能な回答がなかったため、他の人の時間を節約するために投稿しています...

一部の環境では、--target-t)スイッチを使用しても同じエラーが発生します。 Linuxの2つのフレーバーでのテストでは、--prefix=パラメーターを使用したときに同じ問題が発生しました。

コード:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE

説明:多くの環境(MacOS、Amazon Linux、Debian)で機能すると思われる私の回避策は、PYTHONUSERBASE環境変数を一時的な場所に設定することです。 --force-reinstallは、パッケージが既にインストールされている場合でもローカルインストールをトリガーするために使用されます。

これにより、モジュールがコンパイル/インストールされます(OSとPythonバージョン)に依存):/tmp/lib/python2.7/site-packages/*

4
EE1213