DisutilsOptionError: 必须提供 home 或 prefix/exec-prefix ——不能两者兼有

我通常通过 pip 安装 python 软件包。

对于 GoogleAppEngine,我需要将软件包安装到另一个目标目录。

我试过了:

Pip install-I flask-restful —— target./lib

但它失败了:

必须提供 home 或者 prefix/exec-prefix ——而不是两者都提供

我怎么才能让这个起作用?

57496 次浏览

你在使用 OS X 和自制程序吗?Homebrewpython 页面 https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md提出了一个已知的 pip 问题和一个解决方案。

对我有用。

可以将此“空前缀”设置为默认值,方法是添加 ~/. pydistutils.cfg 文件,包含以下内容:

[install]
prefix=

编辑: Homebrew 页面后来被更改为建议在命令行上传递 --prefix,如下面的注释中所讨论的。给你是包含该文本的最后一个版本。不幸的是,这只适用于性骚扰者,不适用于轮子。

问题出在 向 Pip 汇报上,后来又出在 修好了 --user上。这可能就是为什么这一部分现在已经是 从家酿网页上删除了。然而,问题仍然发生在 当使用 --target上面的问题。

另一个解决方案 * 对于家酿用户是简单地使用 virtualenv

当然,无论如何,这个 消除了对目标目录的需求——但是即使它不需要,我发现在虚拟环境中,--target在默认情况下是可以工作的(比如,不需要创建/修改配置文件)。


* 我说的是解决方案,也许这只是另一个动机,一丝不苟地使用 Venvs..。

我在 --install-option="--prefix=lib"周围的其他建议中遇到了错误。我发现唯一有效的方法就是按照 给你的描述使用 PYTHONUSERBASE

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

这不是完全相同的 --target,但它为我在任何情况下的技巧。

正如其他提到的,这是已知的错误与 pip & python 安装自制。

如果你用“空前缀”指令创建 ~/.pydistutils.cfg文件,它会修复这个问题,但它会中断正常的 pip 操作。

在正式解决这个 bug 之前,可以选择创建自己的 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. 创建包含“空前缀”指令的 ~/.pydistutils.cfg文件
  4. 使用提供的参数执行 pip 命令
  5. 删除 ~/.pydistutils.cfg文件

这个脚本可以修改和调整,以满足您的需要,但您得到的想法。它允许你在没有刹车点的情况下运行命令。希望对你有所帮助:)

我相信对于这个问题有一个更简单的解决方案(HomebrewsPython on macOS) ,它不会破坏正常的 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

我也有类似的问题。 我使用 系统标志来避免这个错误,因为我在另一个线程中描述了 给你,在这个线程中我解释了我的情况的具体情况。 我把这个贴在这里,希望能帮助任何人面临同样的问题。

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

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

如果您正在使用 viralenv * ,那么最好再次检查您正在使用的 which pip

如果你看到类似 /usr/local/bin/pip的东西,你已经打破了你的环境。重新激活你的 Virtual alenv 可以解决这个问题:

VirtualEnv: $ source bin/activate

虚拟鱼: $ vf activate [environ]

* : 我使用虚拟鱼,但我认为这个技巧与两者都有关。