用 setup.py install 组合—— user 和—— prefix error

我正在尝试安装 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

The error was extremely perplexing because, as you can see, I wasn't providing the --prefix, --exec-prefix, --install-base, or --install-platbase flags as command line options. I wasted a lot of time trying to figure out what the problem was. I document my answer below, in hopes to spare some other poor soul a few hours of 牦牛刮胡子.

74468 次浏览

One time workaround:

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

或者

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

Note that there is no text (not even whitespace) after the =.

没有忘记 --user标志。

安装多个软件包:

创建 ~/.pydistutils.cfg(或相当于你的操作系统/平台) ,其内容如下:

[install]
prefix=

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

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

最后,删除或重命名此文件。如果保留这个文件,那么在系统范围内使用这个 ~/.pydistutils.cfg作为这个用户安装 Python 包(即不使用 --user)时会出现问题。

这个问题的起因

这似乎是 OpenSUSE 和 RedHat 的一个问题,它们导致了这些平台上的 虚拟世界中的一个错误

这个错误源于系统级的 distutils configuration file(在我的例子中是 /usr/lib64/python2.6/distutils/distutils.cfg)

[install]
prefix=/usr/local

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

正如评论中指出的那样,被接受的答案(由@gotgene 提供,他可能有基因)可能导致意想不到的后果。

@ rogeleaderr 说: “注意,保持这样的文件将使 Python 认为/是您的根 Python 库目录,如果您尝试安装其他新包,将导致令人困惑的问题。”

与像@gotgene 建议的那样编写一个新的配置文件不同,更好的选择是在 命令行上添加 --prefix=(等号右侧没有文本)作为一个选项,如

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

为了节省其他人的时间,张贴,因为没有可用的答案为我工作..。

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

密码:

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

说明: 我的变通方法似乎可以在许多环境(MacOS、 Amazon Linux、 Debian)中使用,那就是将 PYTHONUSERBASE环境变量设置为临时位置。--force-reinstall用于触发本地安装,即使包已经安装。

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

您可以简单地运行 pip install --user .,不需要前缀参数。

无论如何,这样做更好,因为如果将 pip 配置为使用 Python3,它将默认为 python3。 (我忘了输入 python3 setup.py,它在2.7下安装了一个3-only 软件包)

(credit https://stackoverflow.com/a/1550235/4364036)

我也有同样的问题,它被藏在 ~/.config/pip/pip.conf里面:

[global]
target=/foo/bar

Such a config was created by a third-party script without my knowledge.

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

下面这些对我不起作用:

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

但是,当它与 sudo一起使用时,它是可以工作的:

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

感谢 遗传回答