【问题标题】:Ignore certain packages and their dependencies with pip freeze使用 pip freeze 忽略某些包及其依赖项
【发布时间】:2014-05-13 19:41:26
【问题描述】:

标题基本上说明了一切。我如何告诉pip freeze 忽略某些包,例如pylintpep8,以及它们的依赖关系?

【问题讨论】:

标签: python pip


【解决方案1】:

我的方法如下:

  1. 我的.bashrc 我创建了以下别名:alias pipfreezeignore='pip freeze | grep -vFxf ignore_requirements.txt'
  2. 创建虚拟环境,首先安装我不想跟踪的所有包(即pip install jedi flake8 importmagic autopep8 yapf)。
  3. 立即将它们保存在ignore_requirements.txt 文件中,如pip freeze > ignore_requirements.txt
  4. 安装其余的包(例如pip install django
  5. 使用pipfreezeignore > requirements.txt(在ignore_requirements.txt所在的同一文件夹中)所以我只需要在requirements.txt中安装不在ignore_requirements.txt中的软件包

如果您总是想忽略相同的包(通过所有虚拟环境),您可以重新定义别名,如 alias pipfreezeignore='pip freeze | grep -vFxf /abs/path/to/ignore_requirements.txt' 只需确保您的项目实际上不需要来自 ignore_requirements.txt 的任何包。

【讨论】:

  • 哇,多么优雅的解决方案!通过一些工作,它甚至可以成为跟踪其余包的依赖关系的工具,因此如果您的包中存在与您忽略的包的任何依赖项相同的依赖项,它不会忽略它,因为它会项目需要。
【解决方案2】:

可用的选项很少

尝试简单的无知

根本不关心这些包是否存在于pip 输出中。

从输出中删除这些行

通过一些grep 过滤器过滤输出并获得干净的结果。

使用 virtualenv 并且不要在其中安装不需要的软件包

请注意,virtualenv 中的 pip freeze 不会报告全局安装的软件包(但它通常会报告 argparsewsgiref 对我来说 - 似乎没有什么是真正完美的。)

编写自己的pipwarm 命令

这将调用 pip freeze 并根据需要修改输出(删除不需要的文件)。

我知道,我可能没有给你你所要求的答案,但也许 virtualenv 接近你所需要的,因为它允许这些包的全局存在并且仍然允许在 pip freeze 的输出中没有这些包.

pep8pylint 安装为脚本,但要远离pip 可见性

如果您只关心将pylintpep8 用作命令行工具,但不要求pip freeze 可以看到它们,则有多种选择

pep8pylint安装到virtualenv中并将脚本复制到/usr/bin

如果您将pylintpep8 安装到单独的virtualenv 中,请通过which pep8which pylint 找到可执行文件的位置,然后将这些文件复制到某个地方,它们将在那里可见,例如到/usr/bin。您从 virtualenv 复制或移动的脚本具有指向 virtualenv 中所需 python 包的硬编码路径,并且即使在复制时也会安全运行(仅脚本,不要触及相关 virtualenv 的其余部分)。请注意,无需激活 virutalenv 即可使其正常工作。

在系统范围内安装 pep8pylint 但继续在 virtualenv 中开发

系统范围内安装的命令行工具通常安装在某个位置,这使得它们全局可见。同时,在 virtualenv 中调用时,pip freeze 看不到系统范围安装的包。

【讨论】:

  • virtualenv 是问题的一部分。我必须将某些实用程序(如pylintpep8)安装到virtualenv 中才能完全检查它们的源代码,但我不想将它们部署到服务器上。这是 Heroku,所以部署涉及到 pip freeze > requirements.txt。因此,这给我留下了我目前的解决方案,即通过类似虚假 pip 安装的方式手动发现它们的依赖关系,然后使用 vim 手动删除所有行,或者直接忽略它。
  • @Two-BitAlchemist 您真的需要这些包可以导入,还是将其用作命令行工具就足够了?
  • @Two-BitAlchemist 你在这里。答案扩展到涵盖以这种方式安装命令行工具,它们是可用的,但不要破坏我们的pip freeze 输出。
  • 不幸的是,全局安装的 pylint 也会创建大量关于导入失败的垃圾邮件,因为它位于 virtualenv 之外并且无法在路径上看到它们。
  • 当你在 docker 中开发时,这不是一个好的解决方案,同时忽略在开发中使用但在生产中不使用的包也不是一个好的做法。这个问题应该没有任何可接受的答案。
【解决方案3】:

在带有 powershell 的 Windows 上:

 $exclude = 'pylint', 'pep8'  

 pip freeze |  
             Where-Object { $exclude -notcontains $_ } |  
             ForEach-Object { pip install --upgrade $_ }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 2011-08-19
    • 2019-02-07
    • 2022-08-10
    • 2017-12-02
    • 2018-04-13
    相关资源
    最近更新 更多