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

got*_*nes 95 python installation distutils

我试图安装Python包,这是我最近获得的一个系统.我试图利用Python相对较新的每用户site-packages目录和新选项--user.(该选项目前没有记录,但它适用于Python 2.6+;您可以通过运行来查看帮助python setup.py install --help.)

当我试着跑步时

python setup.py install --user
Run Code Online (Sandbox Code Playgroud)

在我下载的任何软件包上,我总是遇到以下错误:

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base
Run Code Online (Sandbox Code Playgroud)

错误是因为非常令人困惑,因为你可以看到,我不提供--prefix,--exec-prefix,--install-base,或--install-platbase标志作为命令行选项.我浪费了很多时间试图找出问题所在.我在下面记录了我的答案,希望能让其他一些可怜的灵魂在几个小时的牦牛皮上刮胡子.

got*_*nes 149

一次解决方法:

pip install --user --install-option="--prefix=" <package_name>
Run Code Online (Sandbox Code Playgroud)

要么

python setup.py install --user --prefix=
Run Code Online (Sandbox Code Playgroud)

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

千万不能忘记的--user标志.

安装多个包:

~/.pydistutils.cfg使用以下内容创建(或等效于您的OS /平台):

[install]
prefix=
Run Code Online (Sandbox Code Playgroud)

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

然后运行必要的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
Run Code Online (Sandbox Code Playgroud)

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

  • 您还可以在命令行中将空--prefix =传递给setup.py以覆盖系统范围内的distutils.cfg中的值 (6认同)
  • 再想一想,这样做会导致主要问题.不要保留此文件.有关详细信息,请参阅brew doctor(假设您在Mac OS X上使用自制程序). (4认同)
  • 哇!这对我也有用.我在尝试安装Powerline时收到了同样的错误.https://powerline.readthedocs.org/en/latest/installation/osx.html#i-receive-an-importerror-when-trying-to-use-powerline-on-os-x (2认同)

小智 7

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

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

代码:

PYTHONUSERBASE=/tmp/ pip install --user --force-reinstall $PACKAGE
Run Code Online (Sandbox Code Playgroud)

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

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


dbl*_*iss 6

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

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

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

$ python setup.py install --user --prefix=
Run Code Online (Sandbox Code Playgroud)