DistutilsOptionError:必须提供家庭或前缀/ exec-前缀 – 不是两个

我通常通过pip安装python包。

对于Google App Engine,我需要将软件包安装到其他目​​标目录。

我试过了:

pip安装-I烧瓶安息–target ./lib

但它失败:

必须提供家庭或前缀/ exec-前缀 – 不是两个

我怎样才能使这个工作?

你使用OS X和Homebrew吗? Homebrew python页面https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md用pip和解决方法调用了一个已知的问题。;

为我工作。

你可以通过添加〜/ .pydistutils.cfg文件来使这个“空白前缀”成为默认值:

[install] prefix= 

编辑:不要使用这个自制软件推荐的选项,它会打破正常的点子操作

我相信这个问题有一个更简单的解决scheme(MacOS上的Homebrew's Python),它不会破坏正常的点操作。

你所要做的就是在项目的根目录下创build一个setup.cfg文件,通常在你的主__init__.py或者可执行文件py的地方。 所以,如果你的项目的根文件夹是: /path/to/my/project/setup.cfg在里面创build一个setup.cfg文件,并把魔法字放在里面:

 [install] prefix= 

好的,现在你可以运行该文件夹的pip命令了:

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

此命令将只适用于该文件夹。 只需将setup.cfg复制到您可能拥有的任何其他项目。 不需要在主目录上写一个.pydistutils.cfg文件。 完成安装模块后,可以删除setup.cfg

另一个针对Homebrew用户的解决scheme就是使用virtualenv

当然,这可能会消除对目标目录的需求,但是即使没有,我也发现--target在虚拟环境中默认工作(如在,不创build/修改configuration文件)。


*我说的解决scheme; 也许这只是精心使用venvs的另一个动机。

在OSX(mac)上,假设一个名为/ var / myproject的项目文件夹

  1. cd /var/myproject
  2. 创build一个名为setup.cfg的文件并添加[install] prefix=
  3. 运行pip install <packagename> -t .

我遇到了其他的build议--install-option="--prefix=lib" 。 我发现的唯一的工作是使用PYTHONUSERBASE 这里描述。

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

这与--target不完全相同,但是无论如何它对我来说都是个诀窍。

正如其他提到的,这是已知的安装了自制软件的pip&python的bug。

如果使用“空前缀”指令创build~/.pydistutils.cfg文件,它将解决这个问题,但是会打破正常的点操作。

在这个错误被正式解决之前,其中一个选项是创build自己的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. 创build带有“空前缀”指令的~/.pydistutils.cfg文件
  4. 用提供的参数执行你的pip命令
  5. 删除~/.pydistutils.cfg文件

这个脚本可以改变,适应你的需求,但你有想法。 它可以让你运行你的命令,而不刹车点。 希望能帮助到你 :)

我有一个类似的问题。 我使用–system标志来避免错误,正如我在其他线程中描述的那样,在这里我将解释我的具体情况。 期待这可以帮助任何面临同样问题的人。