将 --user 和 --prefix 与 setup.py install 结合时出错

118 投票
6 回答
83641 浏览
提问于 2025-04-16 08:49

我最近获得了一个系统的访问权限,想在上面安装一些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 个回答

6

正如评论中提到的,@gotgenes 提出的答案可能会导致一些意想不到的问题。

@rogeleaderr 说:“要注意,像这样保留这个文件会让 Python 认为 / 是你的根 Python 库目录,这样如果你尝试安装其他新包时就会出现一些混乱的问题。”

与其像 @gotgenes 建议的那样写一个新的配置文件,不如在命令行中添加 --prefix=(等号右边不加任何文字)作为一个选项,像这样:

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

发这个帖子是为了节省大家的时间,因为之前没有找到有效的解决办法...

在某些环境下,即使使用了 --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版本)。

173

一次性解决方法:

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的方式运行安装命令。你需要使用上面提到的某种方法来覆盖这个设置。

撰写回答