问题:DistutilsOptionError:必须提供home或prefix / exec-prefix —不能同时提供
我通常是通过pip安装python软件包的。
对于Google App Engine,我需要将软件包安装到另一个目标目录。
我试过了:
pip install -I flask-restful –target ./lib
但是它失败了:
必须提供home或prefix / exec-prefix-不能同时提供
我怎样才能使它工作?
回答 0
您正在使用OS X和Homebrew吗?Homebrew python页面https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md指出了pip的已知问题和解决方法。
为我工作。
通过添加具有以下内容的〜/ .pydistutils.cfg文件,可以将此“空前缀”设置为默认值:
[install] prefix=
编辑:不要使用此Homebrew建议的选项,它将破坏正常的点操作。
回答 1
我相信有一个更简单的解决方案(在macOS上使用Homebrew的Python),不会破坏您的常规pip操作。
您要做的就是setup.cfg
在项目的根目录下创建一个文件,通常在主__init__.py
或可执行py文件所在的位置。因此,如果您的项目的根文件夹为:/path/to/my/project/
,请setup.cfg
在其中创建一个文件,然后在其中放入神奇的单词:
[install]
prefix=
好的,现在您可以为该文件夹运行pip的命令:
pip install package -t /path/to/my/project/
该命令仅在该文件夹中正常运行。只需将其复制setup.cfg
到您可能拥有的任何其他项目中即可。无需.pydistutils.cfg
在主目录上写一个。
安装完模块后,可以将其卸下 setup.cfg
。
回答 2
在OSX(mac)上,假定项目文件夹为/ var / myproject
cd /var/myproject
- 创建一个名为的文件
setup.cfg
并添加[install] prefix=
- 跑
pip install <packagename> -t .
回答 3
针对Homebrew用户的另一种解决方案*仅是使用virtualenv
。
当然,无论如何,这可能会消除对目标目录的需求-但是即使没有,我发现--target
在虚拟环境中时默认情况下也可以工作(例如,无需创建/修改配置文件)。
*我说解决方案;也许这只是精心使用venvs的另一动机…
回答 4
我在周围的其他建议中遇到了错误--install-option="--prefix=lib"
。我发现唯一有效的方法就是PYTHONUSERBASE
按此处所述使用。
export PYTHONUSERBASE=lib
pip install -I flask-restful --user
这与并不完全相同--target
,但是无论如何我都会成功。
回答 5
如其他提到的那样,这是与homebrew一起安装的pip和python的已知错误。
如果~/.pydistutils.cfg
使用“空前缀”指令创建文件,它将解决此问题,但会破坏正常的点操作。
在正式解决此错误之前,一种选择是创建自己的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
该脚本包装了您的命令,并:
- 接受名称和目标参数
- 检查这些参数是否为空
- 创建
~/.pydistutils.cfg
其中带有“空前缀”指令的文件 - 使用提供的参数执行您的pip命令
- 删除
~/.pydistutils.cfg
文件
可以更改此脚本并将其改编为满足您的需求,但您有所想法。而且它使您可以在不制动点的情况下运行命令。希望能帮助到你 :)
回答 6
如果您使用的是virtualenv *,最好再次检查一下which pip
您使用的是哪个。
如果看到类似情况,则说明/usr/local/bin/pip
您已脱离环境。重新激活您的virtualenv将解决此问题:
VirtualEnv: $ source bin/activate
虚拟鱼: $ vf activate [environ]
*:我使用virtualfish,但我认为此技巧与两者都有关。
回答 7
我有一个类似的问题。我用–system标志,以避免错误,因为我粗糙地在这里对其他线程在这里我解释一下我的情况的具体情况。我将其发布在这里,希望可以帮助面临相同问题的任何人。