将--user与--prefix错误与setup.py install结合使用

时间:2010-12-20 23:54:20

标签: python installation distutils

我正在尝试安装Python程序包,这是我最近获得访问权限的系统。我试图利用Python相对较新的per user site-packages directory和新选项--user。 (该选项为currently undocumented,但它适用于Python 2.6+;您可以通过运行python setup.py install --help来查看帮助。)

当我尝试跑步时

python setup.py install --user

在我下载的任何软件包上,我总是遇到以下错误:

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base

错误非常令人困惑,因为正如您所看到的,我没有提供--prefix--exec-prefix--install-base--install-platbase标志作为命令行选项。我浪费了很多时间试图找出问题所在。我在下面记录了我的答案,希望在yak shaving的几个小时内省去其他一些可怜的灵魂。

5 个答案:

答案 0 :(得分:138)

一次解决方法:

pip install --user --install-option="--prefix=" <package_name>

python setup.py install --user --prefix=

请注意=之后没有文字(甚至没有空格)。

忘记--user标志。

安装多个包:

使用以下内容创建~/.pydistutils.cfg(或等效于您的操作系统/平台):

[install]
prefix=

请注意=之后没有文字(甚至没有空格)。

然后运行必要的pip install --userpython setup.py install --user命令。 忘记--user标志。

最后,删除或重命名此文件。保留此文件将导致在系统范围内安装Python软件包时出现问题(即,没有--user),因为此用户使用此~/.pydistutils.cfg

此问题的原因

这似乎是OpenSUSE和RedHat的问题,在这些平台上导致a bug in virtualenv

错误源于系统级distutils configuration file(在我的情况下为/usr/lib64/python2.6/distutils/distutils.cfg),其中有

[install]
prefix=/usr/local

基本上,这相当于始终将安装命令作为install --prefix=/usr/local运行。您必须使用上述技术之一覆盖此规范。

答案 1 :(得分:4)

正如评论中所指出的,接受的答案(由@gotgenes,可能是有基因的人)会导致意想不到的后果。

@rogeleaderr说,“请注意,保留这样的文件将使Python认为/是您的根python库目录,如果您尝试安装其他新软件包会导致混淆问题。”

而不是像@gotgenes建议的那样编写新的配置文件,更好的选择是在命令行上添加--prefix=(等号右边没有文本)作为选项/ em>,如

$ python setup.py install --user --prefix=

答案 2 :(得分:3)

发布以节省其他时间,因为没有可用的答案对我有效...

在某些环境中,使用--target-t)开关仍然会遇到相同的错误。在我对两种版本的linux进行测试时,我在使用--prefix=参数时遇到了同样的问题。

代码:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE

说明: 我的解决方法似乎适用于许多环境(MacOS,Amazon Linux,Debian),是将PYTHONUSERBASE环境变量设置为临时位置。 --force-reinstall用于触发本地安装,即使已经安装了软件包。

这将导致模块被编译/安装(取决于操作系统和Python版本):/tmp/lib/python2.7/site-packages/*

答案 3 :(得分:1)

您只需运行pip install --user .,就不需要前缀参数。

无论如何这会更好,因为如果将pip配置为使用Python 3,它将默认为python3。 (我忘记输入python3 setup.py,它在2.7以下安装了仅3个软件包)

(信用https://stackoverflow.com/a/1550235/4364036

答案 4 :(得分:0)

我有同样的问题。它被隐藏在~/.config/pip/pip.conf内,并带有:

[global]
target=/foo/bar

此类配置是由第三方脚本在我不知情的情况下创建的。

我建议检查pip配置文件并删除target=/foo/bar选项。