【问题标题】:Combine --user with --prefix error with setup.py install将 --user 与 --prefix 错误与 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 后,问题就消失了。

标签: python installation distutils


【解决方案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://stackoverflow.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=
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-29
          • 2017-11-12
          • 2021-02-11
          • 2015-07-30
          • 2014-08-16
          • 2022-11-08
          • 1970-01-01
          • 2020-03-22
          相关资源
          最近更新 更多