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


103

我试图将Python软件包安装到最近可以访问的系统中。我试图利用Python相对较新的每用户site-packages目录以及new选项--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标志作为命令行选项。我浪费了很多时间试图找出问题所在。我在下面记录我的答案,以期使其他一些可怜的人免于数小时的


2
./configure --prefix=${HOME}当在中具有“ user = 1”时,尝试从源代码安装python 3.6时遇到了相同的错误~/.pydistutils.cfg。在这种情况下,我需要临时注释“ user = 1”,以便完成安装过程。
bli

bli给出了一个很好的提示。我想知道--user选项来自哪里,即使我没有使用该选项。pip install --prefix / home / myhomedir。我没有〜/ .pydistutils.cfg文件,仍在寻找--user选项的设置位置。
Kemin Zhou

找出问题的根源。这是特定于Debian的。添加--system选项以提示后,问题消失了。
Kemin Zhou

Answers:


161

一种解决方法:

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标志。

最后,删除或重命名此文件。如果--user以此用户身份在系统范围内安装Python软件包(即,不带),则将该文件保留为当前内容将导致问题~/.pydistutils.cfg

此问题的原因

这似乎与OpenSUSE和RedHat都存在问题,导致这些平台上的virtualenv出现错误

该错误源于系统级distutils配置文件(在我的情况下/usr/lib64/python2.6/distutils/distutils.cfg

[install]
prefix=/usr/local

基本上,这等效于始终以方式运行install命令install --prefix=/usr/local。您必须使用上面的一种技术来覆盖此规范。


1
非常感谢你。空前缀解决了我的问题:pip 1.1 openSuSE 11.4。
guettli 2012年

6
您还可以在命令行中向setup.py传递空的--prefix =,以覆盖系统范围内distutils.cfg中的值
Tuxdude 2012年

2
哇!这也对我有用。尝试安装电力线时收到相同的错误。powerline.readthedocs.org/en/latest/installation/...
A-Dubb

4
再三考虑,这样做会引起重大问题。请勿保留此文件。有关更多信息,请咨询Brew医生(假设您在Mac OS X上使用自制软件)。
A-Dubb

1
请注意,将此文件保持为此类将使Python认为/是您的python库的根目录,如果尝试安装其他新软件包,则会导致令人困惑的问题。
rogueleaderr 2014年

6

正如评论中所指出的那样,公认的答案(@gotgenes,大概拥有基因)可能导致意外的后果。

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

与其按照@gotgenes的建议写一个新的配置文件,一个更好的选择是--prefix=命令行上添加(等号右边没有文本)作为选项,如

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

5

发布信息以节省其他人的时间,因为没有可用的答案对我有用。

在某些环境中,使用--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/*


0

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

这是更好的呢,因为如果你的点子被配置为使用Python 3,将默认为python3(我忘了进入python3 setup.py和它2.7下安装了3只包)

(信贷https://stackoverflow.com/a/1550235/4364036


0

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

[global]
target=/foo/bar

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.