DistutilsOptionError:必须提供home或prefix/exec-prefix之一——不能同时提供
我通常是通过pip来安装Python包。
但是在使用Google App Engine时,我需要把包安装到另一个目标目录。
我试过这样做:
pip install -I flask-restful --target ./lib
但是出现了错误:
必须提供home或prefix/exec-prefix中的一个 -- 不能同时提供两个
我该怎么才能让这个工作呢?
8 个回答
我尝试了其他一些建议,比如使用 --install-option="--prefix=lib"
,但是都出现了错误。最后我发现只有使用 PYTHONUSERBASE
这个方法有效,具体可以参考 这里。
export PYTHONUSERBASE=lib
pip install -I flask-restful --user
这其实和 --target
不完全一样,但对我来说,这个方法有效。
对于使用Homebrew的用户,另一个解决办法就是简单地使用一个virtualenv
。
当然,这样做可能就不需要目标目录了——但即使不需要,我发现当在虚拟环境中时,--target
默认是可以工作的(也就是说,不需要创建或修改配置文件)。
*我说这是个解决办法;也许这只是一个更仔细使用虚拟环境的理由……
在OSX(Mac)上,假设你的项目文件夹叫做 /var/myproject
cd /var/myproject
这条命令是让你进入到这个项目文件夹里。- 创建一个叫做
setup.cfg
的文件,并在里面添加[install] prefix=
这段内容。 - 运行
pip install <packagename> -t .
这条命令来安装你需要的包,记得把替换成你想要安装的包的名字。
我觉得有一个更简单的方法来解决这个问题(在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
。
你在用 OS X 和 Homebrew 吗?Homebrew 的 Python 页面提到了一些关于 pip 的已知问题,以及一个解决方法。你可以在这里查看:https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md
这个方法对我有效。
你可以通过创建一个名为
~/.pydistutils.cfg
的文件,并在里面添加以下内容,来让这个“空前缀”成为默认设置:[install] prefix=
编辑:后来 Homebrew 的页面更新了,建议在命令行中添加 --prefix
,具体可以参考下面的评论。这里是包含该内容的最后一个版本。不幸的是,这个方法只适用于 sdists,而不适用于 wheels。
这个问题已经被报告给 pip,后来 pip 也为 --user
修复了这个问题。这可能就是为什么这个部分现在被从 Homebrew 页面移除了。不过,当使用 --target
时,问题仍然存在,具体可以参考上面的问题链接这里。