【问题标题】:Pip install to custom target directory and exclude specific dependenciesPip 安装到自定义目标目录并排除特定依赖项
【发布时间】:2015-10-30 16:49:49
【问题描述】:

我正在寻找一种使用 pip 或类似方法将 python 包列表安装到自定义目标目录(例如 /mypath/python/pkgs/ ),但也排除/黑名单 特定强>依赖。

我想排除特定的依赖项,因为它们已经从不同的安装路径(例如 anaconda 安装)中遇到。我没有将包添加到默认 python 安装的特权(我也不想)。

我目前正在使用 pip 的 -r 和 -t 选项。但是还没有找到排除特定包的方法。

像这样的 pip 命令是理想的:

pip install --log pip.log -r req.txt -t /mypath/pypkgs/ --exclude exclude.txt

--no-deps 不是一个选项,因为我需要一些依赖项。

我目前正在寻求一个 python 脚本来执行 pip 安装,其中包括我不需要的依赖项:

pip install --log pip.log -r req.txt -t /mypath/python/pkgs/

然后(自动)在 pip 安装完成后删除不需要的依赖项。

我希望 pip 命令的一些组合可以实现我正在寻找的一些简单明了的东西。我正在使用点 7.1.2。谢谢!

类似,但我没有升级并想指定目标路径:

pip: upgrade package without upgrading particular dependency

【问题讨论】:

  • 所以您想使用pip 为您用来运行它的解释器以外的解释器安装软件包?
  • 我不确定我是否在回答您的问题@jonrsharpe:当我将默认安装(anaconda)中的 pip 与 -t [targetdir] 一起使用时,它似乎忽略了我已经使用它的事实(例如,它将再次将 numpy 安装到 [targetdir] 中)。我想在我的目标目录中添加额外的包,而不需要我的默认安装/解释器的重复依赖项。我计划将自定义路径添加到我的 PYTHONPATH。

标签: python pip


【解决方案1】:

面对类似的问题,我使用正在运行的 bash shell 设法排除了特定的包

pip install $(grep -ivE "pkg1|pkg2|pkg3" requirements.txt)

其中pkg1 等是要排除的包的名称。

【讨论】:

  • 如果您制作了一些 cmets,那么您也必须删除它们:pip install $(grep -ivE "^pkg1|^pkg2|^#|^\s*$" requirements.txt | sed s/#.*//g)
  • 但是如果您的 requirements.txt 还包含特定的版本要求,则它不起作用。在你的 requirements.txt 中,它看起来像 pip == 20.0.2,但是当使用上面的命令调用它时,它看起来像 pip install 'pip==20.0.2'。知道如何解决这个问题吗?
  • 我刚刚发现这个很好用! pip install -r <(sed '/^[pk1|pkg2]/d' requirements.txt)
【解决方案2】:

我认为这基本上可以通过几个步骤来实现,假设您使用的是 virtualenv 或类似...

  • 如果您首先执行普通的pip freeze > requirements.txt,您将获得所有的传递依赖项(例如,不排除任何东西。)

  • 现在编辑 requirements.txt,删除要排除的包...

  • 最后,在新环境中执行pip install -r requirements.txt -t ... --no-deps。瞧:您已经安装了所需的依赖项,但排除了特定的依赖项。

【讨论】:

  • 是否可以与其他用户共享 virtualenv?我的用例涉及将同事指向可以附加到 PYTHONPATH 环境变量的路径,我们就完成了。目标是我们都可以共享的标准/默认 python 环境(包含自定义和 3rd 方模块)。此自定义路径将建立在 vanilla anaconda 安装的基础上。 (操作系统:Linux)。
  • 您的意思是预装二进制文件的网络共享?这听起来像是个坏主意,但我想只要每个人都可以访问相同的路径,它就会起作用。 pip install 有什么问题?
  • 对。我们希望使用共享网络路径,因此我们有一个标准环境可以在团队之间共享 - 除了 anaconda。我们处于防火墙环境中 - 所以pip install 不是一个选项(我们将在防火墙外使用 pip,然后在防火墙内传输环境以便我们都可以共享。这似乎比每个可能拥有环境不同)。回到最初的问题,因为 anaconda 我们希望避免重复依赖 (numpy) ,但是 pip -t /path/ 不考虑当前环境。
【解决方案3】:

您可以使用pip install --no-depspip check 来排除特定的包。 我的一个真实例子是当我在Jetson Nano上安装paddleocr时,pip一直为我安装python-opencv,它已经由我自己安装而没有使用pip,但是pip无法检测到它。要停止 pip 为我安装 python-opencv,以下是步骤

  1. 使用pip install --no-deps paddleocr 安装paddleocr 而不使用它的依赖项
  2. 使用pip check列出未解决的依赖关系,重新格式化输出以便pip install -r可以读取,然后删除你不想安装的包(在我的例子中是python-opencv),然后保存它到一个名为 fix-deps.txt 的文件中
  3. 使用pip install --no-deps -r fix-deps.txt 安装未解决的依赖项
  4. 重复步骤 2 和 3,直到 pip check 的输出只包含您不想安装的包。

pip install --no-depspip check 是非常有用的命令,当pip 无法为您解决问题时,它们可以让您自己解决依赖关系。这个方案的缺点是pip check的输出是为人类设计的,不能被pip install -r直接使用,所以你必须手动重新格式化输出或者使用awk命令。

已经为 pip 社区创建了 PR 和 issue,以使 pip check 的输出适合 pip install 阅读,但出于某种原因,他们认为这不是一个好主意。所以我想这是我们现在能做的最好的了。

参考:

  1. https://github.com/pypa/pip/pull/10108
  2. https://github.com/pypa/pip/issues/10066#issuecomment-872638361

【讨论】:

    【解决方案4】:

    考虑子依赖的一种方法是先安装 exclude.txt 环境,然后安装 req.txt 环境,然后检查 diff,最后将其安装到目标目录中。

    使用可在 GNU/Linux 上运行的 virtualenv 的示例:

    virtualenv tmpenv
    source tmpenv/bin/activate
    
    pip install -r exclude.txt
    pip freeze > exclude-with-deps.txt
    pip install -r req.txt
    pip freeze > req-with-deps.txt
    comm -13 exclude-with-deps.txt req-with-deps.txt > final-req.txt
    
    pip install -r final-req.txt --no-deps -t pypkgs
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多