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

Posted

技术标签:

【中文标题】将 --user 与 --prefix 错误与 setup.py install 结合使用【英文标题】:Combine --user with --prefix error with setup.py install 【发布时间】:2011-05-28 13:32:00 【问题描述】:

我试图在我最近获得访问权限的系统上安装 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。

【问题讨论】:

我在尝试使用./configure --prefix=$HOME 从源代码安装python 3.6 时遇到了同样的错误,而~/.pydistutils.cfg 中有“user=1”。在这种情况下,我需要临时注释“user=1”,以便安装过程完成。 bli 给出了很好的提示。我想知道 --user 选项来自哪里,即使我没有使用该选项。 pip install --prefix /home/myhomedir。我没有 ~/.pydistutils.cfg 文件,仍在寻找设置 --user 选项的位置。 找出问题的根源。这是 Debian 特有的。添加 --system 选项来 pip 后,问题就消失了。 【参考方案1】:

我也有同样的问题。它被隐藏在~/.config/pip/pip.conf 中:

[global]
target=/foo/bar

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

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

【讨论】:

【参考方案2】:

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

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

(信用https://***.com/a/1550235/4364036)

【讨论】:

【参考方案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/*

【讨论】:

【参考方案4】:

一次性解决方法:

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 运行安装命令。您必须使用上述技术之一覆盖此规范。

【讨论】:

非常感谢。空前缀解决了我的问题:pip 1.1 openSuSE 11.4。 您还可以在命令行中将空的 --prefix= 传递给 setup.py 以覆盖系统范围的 distutils.cfg 中的值 哇!这对我也有用。我在尝试安装 Powerline 时收到了同样的错误。 powerline.readthedocs.org/en/latest/installation/… 再想一想,这样做会导致重大问题。不要保留此文件。请参阅 brew doctor 了解更多信息(假设您在 Mac OS X 上使用自制软件)。 请注意,像这样保持这个文件会让 Python 认为 / 是您的根 Python 库目录,如果您尝试安装其他新包,则会导致混淆问题。【参考方案5】:

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

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

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

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

【讨论】:

以上是关于将 --user 与 --prefix 错误与 setup.py install 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

nvm 与 npm config "prefix" 选项不兼容:

Python pip install“ DistutilsOptionError:无法将用户与前缀,exec_prefix / home或install_(plat)base合并”]] <<

将程序集 .s 与 gcc 错误链接

Tmux 简单配置使用

Hyperledger Fabric CA User’s Guide——概述

将二进制文件安装到 /bin、/sbin、/usr/bin 和 /usr/sbin,与 --prefix 和 DESTDIR 交互