DistutilsOptionError:必须提供home或prefix/exec-prefix之一——不能同时提供

147 投票
8 回答
58471 浏览
提问于 2025-04-18 10:02

我通常是通过pip来安装Python包。

但是在使用Google App Engine时,我需要把包安装到另一个目标目录。

我试过这样做:

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

但是出现了错误:

必须提供home或prefix/exec-prefix中的一个 -- 不能同时提供两个

我该怎么才能让这个工作呢?

8 个回答

3

我尝试了其他一些建议,比如使用 --install-option="--prefix=lib",但是都出现了错误。最后我发现只有使用 PYTHONUSERBASE 这个方法有效,具体可以参考 这里

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

这其实和 --target 不完全一样,但对我来说,这个方法有效。

12

对于使用Homebrew的用户,另一个解决办法就是简单地使用一个virtualenv

当然,这样做可能就不需要目标目录了——但即使不需要,我发现当在虚拟环境中时,--target 默认是可以工作的(也就是说,不需要创建或修改配置文件)。


*我说这是个解决办法;也许这只是一个更仔细使用虚拟环境的理由……

24

在OSX(Mac)上,假设你的项目文件夹叫做 /var/myproject

  1. cd /var/myproject 这条命令是让你进入到这个项目文件夹里。
  2. 创建一个叫做 setup.cfg 的文件,并在里面添加 [install] prefix= 这段内容。
  3. 运行 pip install <packagename> -t . 这条命令来安装你需要的包,记得把 替换成你想要安装的包的名字。
167

我觉得有一个更简单的方法来解决这个问题(在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

292

你在用 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 时,问题仍然存在,具体可以参考上面的问题链接这里

撰写回答