DistutilsOptionError:必须提供home或prefix / exec-prefix - 而不是两者

问题描述 投票:116回答:8

我通常通过pip安装了python包。

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

我试过了:

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

但它失败了:

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

我怎样才能让它发挥作用?

python google-app-engine install pip distutils
8个回答
263
投票

你在使用OS X和Homebrew吗? Homebrew python页面https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md用pip和一个解决方法调出一个已知问题。

为我工作。

您可以通过添加带有以下内容的〜/ .pydistutils.cfg文件使此“空前缀”成为默认值:

[install]
prefix=

编辑:不要使用这个自制的推荐选项,它会破坏正常的点子操作。


127
投票

我相信这个问题有一个更简单的解决方案(Homebrew的macOS上的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


20
投票

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

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

12
投票

Homebrew用户的另一个解决方案*就是使用virtualenv

当然,这可能会消除对目标目录的需求 - 但即使它没有,我发现--target在虚拟环境中默认工作(如在没有创建/修改配置文件的情况下)。


*我说解决方案;也许这只是精心使用venvs的另一个动机......


3
投票

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

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

这与--target不完全相同,但无论如何它对我都有用。


1
投票

正如其他人提到的,这是用自制软件安装的pip和python的已知错误。

如果使用“空前缀”指令创建~/.pydistutils.cfg文件,它将解决此问题,但它将破坏正常的pip操作。

在此错误被正式解决之前,其中一个选项是创建自己的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文件

这个脚本可以更改和调整,以满足您的需求,但你会明白。它允许您在不制动点的情况下运行命令。希望能帮助到你 :)


0
投票

如果您正在使用virtualenv *,那么仔细检查您正在使用的which pip可能是个好主意。

如果你看到像/usr/local/bin/pip这样的东西,你已经脱离了你的环境。重新激活你的virtualenv将解决这个问题:

VirtualEnv:$ source bin/activate

VirtualFish:$ vf activate [environ]

*:我使用virtualfish,但我认为这个提示与两者都相关。


-1
投票

我有一个类似的问题。我使用--system标志来避免错误,因为我在其他线程上描述了here,在那里我解释了我的具体情况。我发布这里期待这可以帮助任何人面临同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.