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

时间:2014-06-17 07:16:08

标签: python google-app-engine install pip distutils

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

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

我试过了:

  

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

但它失败了:

  

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

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

8 个答案:

答案 0 :(得分:253)

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

为我工作。

  

你可以使这个"空前缀"通过添加一个默认值   〜/ .pydistutils.cfg文件包含以下内容:

[install]
prefix=

编辑:不要使用此自制软件推荐选项,将破坏正常的点操作

答案 1 :(得分:115)

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

答案 2 :(得分:18)

在OSX(mac)上,假设一个名为/ var / myproject

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

答案 3 :(得分:12)

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

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

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

答案 4 :(得分:2)

我点击--install-option="--prefix=lib"周围的其他推荐错误。我发现唯一有效的方法是使用here所述的PYTHONUSERBASE

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

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

答案 5 :(得分:1)

正如其他人提到的,这是已知的pip&amp; amp;用自制软件安装python。

如果使用&#34;空前缀&#34;创建~/.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

此脚本包装您的命令并且:

  1. 接受名称和目标参数
  2. 检查这些参数是否为空
  3. 使用&#34;空前缀&#34;创建~/.pydistutils.cfg文件其中的说明
  4. 使用提供的参数
  5. 执行您的pip命令
  6. 删除~/.pydistutils.cfg文件
  7. 此脚本可以更改和调整以满足您的需求,但您会明白。它允许您在不制动点的情况下运行命令。希望它有所帮助:)

答案 6 :(得分:0)

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

如果您看到类似/usr/local/bin/pip的内容,那么您已经脱离了环境。重新激活你的virtualenv将解决这个问题:

VirtualEnv:$ source bin/activate

VirtualFish:$ vf activate [environ]

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

答案 7 :(得分:-1)

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