--userと--prefixエラーをsetup.py installと組み合わせる


103

最近アクセスしたシステムに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コマンドラインオプションとしてフラグを。私は問題が何であるかを理解しようとして多くの時間を無駄にしました。私は以下の私の回答を文書化します。他の貧しい魂を数時間ヤクのひげ剃りから救うことを期待しています。


2
./configure --prefix=${HOME}で「user = 1」を使用しているときに、ソースからpython 3.6をインストールしようとすると同じエラーが発生しました~/.pydistutils.cfg。その場合、インストールプロセスを完了できるように、「user = 1」という一時的なコメントを付ける必要があります。
bli

bliは良いヒントを与えました。--userオプションは、そのオプションを使用しなかった場合でも、どこから来るのかと思っていました。pip install --prefix / home / myhomedir。〜/ .pydistutils.cfgファイルがなく、-userオプションが設定されている場所を探しています。
Kemin Zhou、

問題の原因を突き止めます。これはDebian固有です。pipに--systemオプションを追加した後、問題は解消しました。
ケミン周

回答:


161

一度の回避策:

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

または

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

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

ではないことを忘れ--userフラグ。

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

~/.pydistutils.cfg以下の内容で(またはOS /プラットフォームの同等のもの)を作成します。

[install]
prefix=

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

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

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

この問題の原因

これはOpenSUSEとRedHatの両方に問題があるようで、これらのプラットフォームのvirtualenvバグが発生しています。

エラーは、これがあったシステムレベルのdistutils構成ファイル(私の場合/usr/lib64/python2.6/distutils/distutils.cfg)に起因します

[install]
prefix=/usr/local

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


1
どうもありがとうございました。空のプレフィックスで問題が解決しました:pip 1.1 openSuSE 11.4。
guettli 2012

6
コマンドラインで空の--prefix =をsetup.pyに渡して、システム全体のdistutils.cfgの値を上書きすることもできます
Tuxdude

2
うわー!これも私にとってはうまくいきました。Powerlineをインストールしようとすると、同じエラーが発生しました。powerline.readthedocs.org/en/latest/installation/...
A-DUBB

4
考え直してみると、これを行うとメジャーな問題が発生します。このファイルを保管しないでください。詳細については、Brew Doctorを参照してください(Mac OS XでHomebrewを使用している場合)。
A-Dubb 2013

1
このファイルをこのようにしておくと、Pythonは/をルートpythonライブラリディレクトリであると見なし、他の新しいパッケージをインストールしようとすると混乱する問題につながることに注意してください。
ローグリーダー2014

6

コメントで述べたように、(@ gotgenes、おそらく遺伝子を持っている)承認された回答は、予期しない結果をもたらす可能性があります。

@rogeleaderrは、「このファイルをこのようにしておくと、Pythonが/をルートpythonライブラリディレクトリであると見なし、他の新しいパッケージをインストールしようとすると混乱する問題につながることに注意してください。」

@gotgenesが推奨するようむしろ書き込み新しい設定ファイルよりも、より良いオプションが追加することです--prefix= オプションとして(の右側にテキストのない等号)、コマンドラインのように、

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

5

他の時間を節約するために投稿しました。利用できる回答がなかったので...

一部の環境では、--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/*


0

単純にを実行できpip install --user .ます。プレフィックス引数は必要ありません。

とにかく、pipがPython 3を使用するように構成されている場合、デフォルトでpython3になるため、これはより優れています(入力するのを忘れてpython3 setup.py、2.7で3のみのパッケージをインストールしました)。

(クレジットhttps://stackoverflow.com/a/1550235/4364036


0

私も同じ問題を抱えていました。それはの中に隠されてい~/.config/pip/pip.confました:

[global]
target=/foo/bar

このような設定は、私の知らないうちにサードパーティのスクリプトによって作成されました。

私は、pip構成ファイルを確認し、target=/foo/barオプションを削除することをお勧めします。

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