使用pip freeze忽略某些包及其依赖关系

12

标题基本上已经说明了一切。我该如何告诉pip freeze 忽略某些软件包,例如pylintpep8及其依赖项?


尝试使用pipreqs - haccks
4个回答

12

我的做法如下:

  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中没有软件包实际上对您的项目是必需的。


哇,多么优雅的解决方案!再加上一些工作,这甚至可以成为一个跟踪其余包依赖关系的工具,因此,如果您的包与任何被忽略的包的依赖项存在共同依赖关系,则不会忽略它,因为它对项目是必需的。 - emi

7

可选方案如下:

尝试简单忽略

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

从输出中删除这些行

通过 grep 过滤器过滤输出并使结果清晰。

使用 virtualenv 并避免安装不需要的包

请注意,虚拟环境中的 pip freeze 不会报告全局安装的包(但通常会为我报告 argparse 和 wsgiref - 没有完美的解决方法)。

编写自己的 pipwarm 命令

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

我知道,我可能没有给出你想要的答案,但也许虚拟环境接近你所需的,因为它允许这些包的全局存在,同时允许在 pip freeze 的输出中没有这些包。

pep8pylint 安装为脚本,但不让它们被 pip 发现

如果您只关心将 pylintpep8 作为命令行工具可用,但不需要它们在 pip freeze 中可见,有多种选择:

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

如果您将 pylintpep8 安装到单独的虚拟环境中,请通过 which pep8which pylint 找到可执行文件的位置,并将这些文件复制到某个可见的位置,例如 /usr/bin。从虚拟环境中复制或移动的脚本具有对虚拟环境中所需 python 包的硬编码路径,并且即使复制(只是脚本,不要触摸其他相关虚拟环境),它们也可以安全运行。请注意,无需激活给定的虚拟环境即可使其工作。

系统范围内安装 pep8pylint,但在虚拟环境中进行开发

通常会将系统范围内安装的命令行工具安装到全局可见的位置。同时,在虚拟环境中调用 pip freeze 时,系统范围内安装的包不会被看到。


1
虚拟环境是问题的一部分。我必须将某些实用程序,如pylintpep8安装到虚拟环境中,以便能够完全检查源代码,但我不想将它们部署到服务器上。这是Heroku,因此部署涉及pip freeze > requirements.txt。因此,这让我采取了当前的解决方案,即通过类似于虚假pip安装的方式手动发现其依赖项,然后手动使用vim删除所有行,或者只是忽略它。 - Two-Bit Alchemist
@Two-BitAlchemist,您真的需要这些软件包可供导入使用吗?还是将其作为命令行工具可用就足够了? - Jan Vlcinsky
@Two-BitAlchemist,这是给你的。回答扩展了命令行工具的安装方式,使其可用,但不会破坏我们的pip freeze输出。 - Jan Vlcinsky
不幸的是,全局安装的 pylint 也会创建大量垃圾信息,因为它在虚拟环境之外,无法在路径上看到失败的导入。 - Two-Bit Alchemist
决定接受,因为尽管我最终对解决方案感到失望,但我基本上选择了你的第一个选项,简单地拒绝关心它们是否包含在输出中并且不必要地安装。 - Two-Bit Alchemist
2
当你在Docker中开发时,这不是一个好的解决方案,而且忽略在开发中使用但在生产中没有用到的软件包也不是一个好的做法。这个问题应该没有任何被接受的答案。 - anishtain4

3
你现在可以使用 pip freeze --exclude <package> 命令,它可以从输出结果中排除指定的包。请参考文档

2

在Windows系统中使用PowerShell:

 $exclude = 'pylint', 'pep8'  

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接