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


144

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

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

我试过了:

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

但是它失败了:

必须提供home或prefix / exec-prefix-不能同时提供

我怎样才能使它工作?

Answers:


289

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

为我工作。

通过添加具有以下内容的〜/ .pydistutils.cfg文件,可以将此“空前缀”设置为默认值:

[install]
prefix=

编辑:不要使用此Homebrew建议的选项,它将破坏正常的点操作


5
好东西,链接是坏的,这是新的我想到:github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/...
patt0

6
请注意,该文件对我来说破坏了虚拟环境。
Dmytro Sadovnychyi

16
此空前缀业务中断了正常pip install操作:(
Jaap 2015年

10
有谁知道如何--target破坏默认pip install行为的情况下允许?
ryantuck '16

3
这似乎不再有效。链接已断开,更新的链接没有谈论pydistutils.cfg
Lucretiel

164

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


2
这也与pip3.6完美配合。而且我的点子仍然完好无损。
汉尼拔

10
这应该是公认的答案。避免引起全局点设置问题。
TrinitronX

10
强调setup.cfg安装后拆卸部分。我花了整整2天的时间来弄清楚为什么我的virtualenv环境被搞砸了,并出现诸如的错误Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install'。删除安装文件恢复了我的理智
kip2

1
@ kip2是,您正确地指出了,因此我编辑了答案以强调这一点,AndreG请注意。
bool.dev

感谢您的注意。如果我说“完成模块安装后,应该删除setup.cfg”会更正确吗?
AndreG

25

在OSX(mac)上,假定项目文件夹为/ var / myproject

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

1
我不确定这与@AndreG答案有什么不同
Alastair McCormack

对我而言,不同之处在于此解决方案cd进入目录,并且确实-t .不在目录之外。这种方式对我有用,而另一种却没有,尽管我不知道为什么。
Chuck Wilbur

12

针对Homebrew用户的另一种解决方案*仅是使用virtualenv

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


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


3
简直是一个月前。只是让我自己回答了我自己的问题;提前...
OJFord

因此,我最近在OP的问题中遇到了这个问题,创建一个virtualenv就为我解决了这个问题。我仍然可以安装到目标目录中。我的问题也更加复杂,因为我也安装了python3,但为virtualenv解决方案设置了+1。
乔什·布朗

3

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

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

这与并不完全相同--target,但是无论如何我都会成功。


2

如其他提到的那样,这是与homebrew一起安装的pip和python的已知错误。

如果~/.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. 创建~/.pydistutils.cfg其中带有“空前缀”指令的文件
  4. 使用提供的参数执行您的pip命令
  5. 删除~/.pydistutils.cfg文件

可以更改此脚本并将其改编为满足您的需求,但您有所想法。而且它使您可以在不制动点的情况下运行命令。希望能帮助到你 :)


2

如果您使用的是virtualenv *,最好再次检查一下which pip您使用的是哪个。

如果看到类似情况,则说明/usr/local/bin/pip您已脱离环境。重新激活您的virtualenv将解决此问题:

VirtualEnv: $ source bin/activate

虚拟鱼: $ vf activate [environ]

*:我使用virtualfish,但我认为此技巧与两者都有关。


在我类似的情况下,使用virtualenv实际上是解决方案:)
chriscatfr

-1

我有一个类似的问题。我用--system标志,以避免错误,因为我粗糙地在这里对其他线程在这里我解释一下我的情况的具体情况。我将其发布在这里,希望可以帮助面临相同问题的任何人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.