DistutilsOptionError:ホームまたはプレフィックス/ exec-プレフィックスのいずれかを提供する必要があります—両方ではありません


144

私は通常、pipを介してpythonパッケージをインストールしています。

Google App Engineの場合、別のターゲットディレクトリにパッケージをインストールする必要があります。

私はもう試した:

pip install -Iフラスコ-レストフル--target ./lib

しかし、それは失敗します:

homeまたはprefix / exec-prefixのいずれかを指定する必要があります。両方は指定できません

これを機能させるにはどうすればよいですか?

回答:


289

OS XとHomebrewを使用していますか?Homebrewのpythonページhttps://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.mdは、pipの既知の問題と回避策を示しています。

私のために働いた。

次の内容の〜/ .pydistutils.cfgファイルを追加することで、この「空のプレフィックス」をデフォルトにすることができます。

[install]
prefix=

編集:このHomebrew推奨オプションを使用しないでください。通常のPIP操作が中断されます。


5
良いもの、リンクは悪いです、これは私が期待して新しいものです:github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/...
patt0

6
そのファイルは私にとって仮想環境を壊したことに注意してください。
Dmytro Sadovnychyi 2015

16
この空のプレフィックスビジネスは通常のpip install操作を壊します:(
Jaap

10
デフォルトの動作を台無しに--targetに許可する方法を見つけた人いますpip installか?
ryantuck

3
これはもう有効ではないようです。リンクは壊れており、更新されたリンクはpydistutils.cfgについて話していません
Lucretiel

164

この問題(macOSでのHomebrewのPython)には、通常のPIP操作を中断しないより簡単な解決策があると思います。

あなたがしなければならないのはsetup.cfg、プロジェクトのルートディレクトリにファイルを作成することだけです。通常、メイン__init__.pyまたは実行可能なpyファイルがある場所です。したがって、プロジェクトのルートフォルダーがである場合は、そこにファイルを/path/to/my/project/作成し、setup.cfgその中に魔法の言葉を入れます。

[install]
prefix=  

OK、これでそのフォルダに対してpipのコマンドを実行できるようになります。

pip install package -t /path/to/my/project/  

このコマンドは、そのフォルダーに対してのみ正常に実行されます。setup.cfg他のプロジェクトにコピーするだけです。.pydistutils.cfgホームディレクトリにを書き込む必要はありません。

モジュールのインストールが完了したらを削除できますsetup.cfg


2
これは、pip3.6でも完全に機能しました。そして私のピップはまだ無傷です。
ハンニバル

10
これは受け入れられる答えになるはずです。グローバルpip設定で問題が発生するのを回避します。
TrinitronX

10
setup.cfgインストール後の削除部分に重点を置いています。私は、virtualenv環境が台無しにされた理由を解明しようと、丸一日2日を費やしましたCould not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'。セットアップファイルを削除すると正気が回復しました
kip2

1
@ kip2はい、あなたが正しく指摘しているので、そのビットを強調するために回答を編集しました。AndreGに注意してください。
bool.dev

注意していただきありがとうございます。「モジュールのインストールが完了したら、setup.cfgを削除する必要があります」と言った方が正しいでしょうか?
AndreG

25

OSX(mac)では、/ var / myprojectというプロジェクトフォルダーを想定

  1. cd /var/myproject
  2. というファイルを作成してsetup.cfg追加 [install] prefix=
  3. 走る pip install <packagename> -t .

1
これが@AndreGの回答とどのように違うのかわかりません
Alastair McCormack

私にとっての違いは、このソリューションはディレクトリにcdし、ディレクトリの-t .外に留まる代わりに実行するということです。この方法は私には効果があり、他の方法は効果がありませんでしたが、理由はわかりません。
チャックウィルバー

12

Homebrewユーザーの別のソリューション*は、単にを使用することvirtualenvです。

もちろん、それによってターゲットディレクトリの必要性取り除かれる可能性があります。ただし、そうでなくても--target、仮想環境ではデフォルトで(構成ファイルの作成/変更を行わずに)動作することがわかりました。


*私は解決策を言います。多分それはvenvを細心に使用するもう1つの動機です...


3
これがほんの1か月前だったとは信じられません。自分の質問に答えるのに気づきました。事前に...
OJFord 2016

したがって、私は最近OPの質問に問題があり、virtualenvを作成するだけで問題が解決しました。それでもターゲットディレクトリにインストールできます。私はpython3もインストールしたため、私の問題はさらに複雑でしたが、virtualenvソリューションでは+1でした。
ジョシュブラウン

3

周りの他の推奨事項でエラーが発生しました--install-option="--prefix=lib"。私が機能したことがわかった唯一のものPYTHONUSERBASEは、ここで説明さているように使用しています

export PYTHONUSERBASE=lib
pip install -I flask-restful --user

これはとまったく同じ--targetではありませんが、いずれにしても私にとってはトリックです。


2

他にも述べたように、これは、homebrewでインストールされたpipとpythonの既知のバグです。

~/.pydistutils.cfg「プレフィックスが空」の命令でファイルを作成すると、この問題は修正されますが、通常のPIP操作が中断されます。

このバグが正式に対処されるまで、オプションの1つは、このケースを処理する独自のbashスクリプトを作成することです。

 #!/bin/bash

 name=''
 target=''

 while getopts 'n:t:' flag; do
     case "${flag}" in
         n) name="${OPTARG}" ;;
         t) target="${OPTARG}" ;;
     esac
 done

 if [ -z "$target" ];
 then
     echo "Target parameter must be provided"
     exit 1
 fi

 if [ -z "$name" ];
 then
     echo "Name parameter must be provided"
     exit 1
 fi

 # current workaround for homebrew bug
 file=$HOME'/.pydistutils.cfg'
 touch $file

 /bin/cat <<EOM >$file
 [install]
 prefix=
 EOM
 # end of current workaround for homebrew bug

 pip install -I $name --target $target

 # current workaround for homebrew bug
 rm -rf $file
 # end of current workaround for homebrew bug

このスクリプトは、コマンドと次のものをラップします。

  1. 名前とターゲットパラメータを受け入れる
  2. これらのパラメータが空かどうかを確認します
  3. ~/.pydistutils.cfg「空の接頭辞」命令を含むファイルを作成します
  4. 指定されたパラメーターを使用してpipコマンドを実行します
  5. ~/.pydistutils.cfgファイルを削除します

このスクリプトは、ニーズに対応するように変更および適合できますが、アイデアは得られます。そしてそれはあなたがピップをブレーキをかけずにあなたのコマンドを実行することを可能にします。それが役に立てば幸い :)


2

virtualenv *を使用している場合は、使用していることを再確認するwhich pipことをお勧めします。

あなた/usr/local/bin/pipがあなたの環境から抜け出したような何かを見た場合。virtualenvを再アクティブ化するとこれが修正されます:

VirtualEnv: $ source bin/activate

VirtualFish: $ vf activate [environ]

*:私はvirtualfishを使用していますが、このヒントは両方に当てはまると思います。


virtualenvを使用することは、実際には私の同じような場合の解決策でした:)
chriscatfr

-1

同様の問題があります。私が使用し--system私はdecribeとしてエラーを回避するためのフラグをここで私は私の状況の具体的なケースを説明し、他のスレッドで。私はこれをここに投稿し、同じ問題に直面している人を助けることができると期待しています。

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