web-dev-qa-db-ja.com

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

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

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

私はもう試した:

pip install -I flask-restful --target ./lib

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

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

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

128
Arkind

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

私のために働いた。

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

[install]
prefix=

Edit:このHomebrew推奨オプションを使用しないでください。は通常のpip操作を中断します

272
ayvazj

この問題(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

132
AndreG

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

  1. cd /var/myproject
  2. setup.cfgというファイルを作成し、[install] prefix=を追加します
  3. pip install <packagename> -t .を実行します
21
Jerome Anthony

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

もちろん、それはmayとにかくターゲットディレクトリの必要性を削除します-しかし、そうでない場合でも、--targetがデフォルトで機能することを発見しました(たとえば、 configファイル)仮想環境の場合。


*私は解決策を言う;おそらくそれは、venvsを細心の注意を払って使用することのもう1つの動機です...

12
OJFord

--install-option="--prefix=lib"に関する他の推奨事項でエラーが発生しました。私が見つけた唯一のことは、説明されているようにPYTHONUSERBASEを使用することです here

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

これは--targetとまったく同じではありませんが、どのような場合でも私にとってはうまくいきます。

3
Imran Rashid

他にも述べたように、これはpipとhomebrewでインストールされた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ファイルを削除します

このスクリプトは、ニーズに合わせて変更および調整できますが、アイデアは得られます。また、pipにブレーキをかけずにコマンドを実行できます。それが役に立てば幸い :)

1
vs.

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

/usr/local/bin/pipのようなものが表示される場合、環境から抜け出していることになります。 virtualenvを再アクティブ化すると、これが修正されます。

VirtualEnv:$ source bin/activate

VirtualFish:$ vf activate [environ]

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

1
Graham P Heath