我正在尝试安装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的几个小时内省去其他一些可怜的灵魂。
答案 0 :(得分:138)
pip install --user --install-option="--prefix=" <package_name>
或
python setup.py install --user --prefix=
请注意=
之后没有文字(甚至没有空格)。
不忘记--user
标志。
使用以下内容创建~/.pydistutils.cfg
(或等效于您的操作系统/平台):
[install]
prefix=
请注意=
之后没有文字(甚至没有空格)。
然后运行必要的pip install --user
或python 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个软件包)
答案 4 :(得分:0)
我有同样的问题。它被隐藏在~/.config/pip/pip.conf
内,并带有:
[global]
target=/foo/bar
此类配置是由第三方脚本在我不知情的情况下创建的。
我建议检查pip配置文件并删除target=/foo/bar
选项。