将 --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 --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
运行安装命令。您必须使用上述技术之一覆盖此规范。
【讨论】:
非常感谢。空前缀解决了我的问题: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合并”]] <<
Hyperledger Fabric CA User’s Guide——概述
将二进制文件安装到 /bin、/sbin、/usr/bin 和 /usr/sbin,与 --prefix 和 DESTDIR 交互