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的项目文件夹
-
cd /var/myproject
- 创build一个名为
setup.cfg
的文件并添加[install] prefix=
- 运行
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
这个脚本包装你的命令和:
- 接受名称和目标参数
- 检查这些参数是否为空
- 创build带有“空前缀”指令的
~/.pydistutils.cfg
文件 - 用提供的参数执行你的pip命令
- 删除
~/.pydistutils.cfg
文件
这个脚本可以改变,适应你的需求,但你有想法。 它可以让你运行你的命令,而不刹车点。 希望能帮助到你 :)
我有一个类似的问题。 我使用–system标志来避免错误,正如我在其他线程中描述的那样,在这里我将解释我的具体情况。 期待这可以帮助任何面临同样问题的人。