【问题标题】:DistutilsOptionError: must supply either home or prefix/exec-prefix -- not bothDistutilsOptionError: 必须提供 home 或 prefix/exec-prefix -- 不能同时提供
【发布时间】:2014-08-07 02:40:03
【问题描述】:

我一般都是通过pip安装python包的。

对于 Google App Engine,我需要将包安装到另一个目标目录。

我试过了:

pip install -I flask-restful --target ./lib

但它失败了:

必须提供 home 或 prefix/exec-prefix -- 不能同时提供

我怎样才能让它工作?

【问题讨论】:

    标签: python google-app-engine installation pip distutils


    【解决方案1】:

    您使用的是 OS X 和 Homebrew 吗? Homebrew python 页面https://github.com/Homebrew/brew/blob/master/docs/Homebrew-and-Python.md 指出了一个已知的 pip 问题和解决方法。

    为我工作。

    您可以通过添加一个 ~/.pydistutils.cfg 文件,内容如下:

    [install]
    prefix=
    

    编辑: Homebrew 页面后来更改为建议在命令行上传递 --prefix,如下面的 cmets 所述。 Here 是包含该文本的最后一个版本。不幸的是,这只适用于 sdists,而不适用于轮子。

    问题是reported to pip,后来是fixed it for --user。这可能就是该部分现在为removed from the Homebrew page 的原因。但是,问题仍然出现when using --target,如上面的问题。

    【讨论】:

    • 好东西,链接坏了,这是我期待的新的:github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/…
    • 请注意,该文件破坏了我的虚拟环境。
    • 这个空前缀业务破坏了正常的pip install操作:(
    • 有没有人想出如何允许--target 破坏默认pip install 行为?
    • 这似乎不再有效。链接已损坏,更新后的链接未提及 pydistutils.cfg
    【解决方案2】:

    我相信这个问题有一个更简单的解决方案(macOS 上的 Homebrew 的 Python),它不会破坏你正常的 pip 操作。

    您所要做的就是在项目的根目录下创建一个setup.cfg 文件,通常是您的主__init__.py 或可执行py 文件所在的位置。所以如果你的项目的根文件夹是:/path/to/my/project/,在里面创建一个setup.cfg文件,把魔法词放进去:

    [install]
    prefix=  
    

    好的,现在你可以为该文件夹运行 pip 的命令了:

    pip install package -t /path/to/my/project/  
    

    此命令将仅针对该文件夹正常运行。只需将setup.cfg 复制到您可能拥有的任何其他项目中。无需在您的主目录上写.pydistutils.cfg

    安装完模块后,您可以删除setup.cfg

    【讨论】:

    • 这也适用于 pip3.6。我的点子还完好无损。
    • 这应该是公认的答案。避免导致全局 pip 设置出现问题。
    • 强调安装部分后删除setup.cfg。我花了整整 2 天的时间试图弄清楚为什么我的 virtualenv 环境被搞砸了,出现了Could not install packages due to an EnvironmentError: [Errno 1] Operation not permitted: '/bin/easy_install' 之类的错误。删除设置文件恢复了我的理智
    • @kip2 是的,你说得对,所以我编辑了答案以强调这一点,AndreG 请注意。
    • 感谢您的关注。如果我说“安装完模块后,应该删除 setup.cfg”会更正确吗?
    【解决方案3】:

    如果您使用的是 virtualenv*,最好仔细检查您正在使用的 which pip

    如果您看到/usr/local/bin/pip 之类的内容,您已经脱离了您的环境。重新激活您的 virtualenv 将解决此问题:

    虚拟环境:$ source bin/activate

    虚拟鱼:$ vf activate [environ]

    *:我使用 virtualfish,但我认为这个技巧与两者都相关。

    【讨论】:

    • 使用 virtualenv 实际上是我类似案例中的解决方案:)
    【解决方案4】:

    在 OSX(mac) 上,假设有一个名为 /var/myproject 的项目文件夹

    1. cd /var/myproject
    2. 创建一个名为setup.cfg 的文件并添加 [install] prefix=
    3. 运行pip install <packagename> -t .

    【讨论】:

    • 我不确定这与@AndreG 的回答有何不同
    • 对我来说不同的是,这个解决方案 cd 进入目录并执行 -t . 而不是留在目录之外。这种方式对我有用,而另一种则没有,尽管我不知道为什么。
    【解决方案5】:

    我也有类似的问题。 我使用 --system 标志来避免错误,因为我在其他线程上描述了here,我解释了我的具体情况。 我在这里发布这个希望可以帮助任何面临同样问题的人。

    【讨论】:

      【解决方案6】:

      我在 --install-option="--prefix=lib" 周围的其他建议中遇到了错误。我发现唯一有效的方法是使用PYTHONUSERBASE,如here 所述。

      export PYTHONUSERBASE=lib
      pip install -I flask-restful --user
      

      这与--target 不完全相同,但无论如何它都对我有用。

      【讨论】:

        【解决方案7】:

        正如其他人提到的,这是使用自制软件安装的 pip 和 python 的已知错误。

        如果您使用“空前缀”指令创建 ~/.pydistutils.cfg 文件,它将解决此问题,但会破坏正常的 pip 操作。

        在正式解决此错误之前,一种选择是创建您自己的 bash 脚本来处理这种情况:

         #!/bin/bash
        
         name=''
         target=''
        
         while getopts 'n:t:' flag; do
             case "${flag}" in
                 n) name="${OPTARG}" ;;
                 t) target="${OPTARG}" ;;
             esac
         done
        
         if [ -z "$target" ];
         then
             echo "Target parameter must be provided"
             exit 1
         fi
        
         if [ -z "$name" ];
         then
             echo "Name parameter must be provided"
             exit 1
         fi
        
         # current workaround for homebrew bug
         file=$HOME'/.pydistutils.cfg'
         touch $file
        
         /bin/cat <<EOM >$file
         [install]
         prefix=
         EOM
         # end of current workaround for homebrew bug
        
         pip install -I $name --target $target
        
         # current workaround for homebrew bug
         rm -rf $file
         # end of current workaround for homebrew bug
        

        这个脚本包装了你的命令并且:

        1. 接受名称和目标参数
        2. 检查这些参数是否为空
        3. 创建带有“空前缀”指令的~/.pydistutils.cfg 文件
        4. 使用提供的参数执行您的 pip 命令
        5. 删除~/.pydistutils.cfg 文件

        可以更改和调整此脚本以满足您的需求,但您会明白的。它允许您在不制动 pip 的情况下运行您的命令。希望对你有帮助:)

        【讨论】:

          【解决方案8】:

          Homebrew 用户的另一个解决方案* 就是使用 virtualenv

          当然,可能 无论如何都不需要目标目录 - 但即使没有,我发现 --target 默认工作(如,无需创建/修改配置文件)在虚拟环境中时。


          *我说解决方案;也许这只是精心使用 venvs 的另一个动机......

          【讨论】:

          • 不敢相信这只是一个月前的事情。刚刚发现自己在回答自己的问题;提前...
          • 所以,我最近遇到了 OP 的问题,仅仅创建一个 virtualenv 为我解决了这个问题。我仍然可以安装到目标目录中。我的问题也很复杂,因为我也安装了 python3,但为 virtualenv 解决方案 +1。
          猜你喜欢
          • 2016-03-28
          • 2020-11-26
          • 2017-07-18
          • 2020-08-10
          • 2021-02-19
          • 2020-07-08
          • 2018-12-04
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多