将 --user 和 --prefix 与 setup.py install 结合时出错
我最近获得了一个系统的访问权限,想在上面安装一些Python包。我想利用Python比较新的用户专属的包目录和一个新选项--user
。(这个选项目前没有文档说明,但在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
这些标志。我花了很多时间试图找出问题所在。为了帮助其他人少花几个小时在这种无谓的折腾上,我在下面记录了我的解决办法。
6 个回答
正如评论中提到的,@gotgenes 提出的答案可能会导致一些意想不到的问题。
@rogeleaderr 说:“要注意,像这样保留这个文件会让 Python 认为 / 是你的根 Python 库目录,这样如果你尝试安装其他新包时就会出现一些混乱的问题。”
与其像 @gotgenes 建议的那样写一个新的配置文件,不如在命令行中添加 --prefix=
(等号右边不加任何文字)作为一个选项,像这样:
$ python setup.py install --user --prefix=
发这个帖子是为了节省大家的时间,因为之前没有找到有效的解决办法...
在某些环境下,即使使用了 --target
(-t
)这个选项,仍然会遇到同样的错误。在我测试的两种Linux系统上,使用 --prefix=
参数时也遇到了同样的问题。
代码:
PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE
解释:
我找到的一个解决办法,在很多环境下都能用(比如MacOS、亚马逊Linux、Debian),就是把 PYTHONUSERBASE
这个环境变量设置为一个临时位置。使用 --force-reinstall
可以强制重新安装,即使这个包已经安装过了。
这样做的结果是,模块会被编译/安装到: /tmp/lib/python2.7/site-packages/*
(具体取决于操作系统和Python版本)。
一次性解决方法:
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上,导致了在这些平台上virtualenv
的一个错误。
错误的根源在于一个系统级的distutils配置文件
(在我的情况下是/usr/lib64/python2.6/distutils/distutils.cfg
),里面有这样的内容:
[install]
prefix=/usr/local
基本上,这相当于总是以install --prefix=/usr/local
的方式运行安装命令。你需要使用上面提到的某种方法来覆盖这个设置。