如何检查Python项目中是否使用了requirements.txt文件中列出的所有包

Mar*_*cin 7 python python-3.x requirements.txt

我有一个包含所有已安装软件包的需求文件。在项目的大规模重构过程之后,不再需要列出的一些包。问题是我不确定是哪一个。有没有办法确定requirements.txt文件中列出的哪些包在代码中实际使用?

bla*_*ndt 5

使用 Python 库的替代答案:pipreqs. 请参阅自动创建requirements.txt

使用默认参数运行 pipreqs 将为requirements.txt您生成一个。

$ pipreqs /home/project/location
Successfully saved requirements file in /home/project/location/requirements.txt
Run Code Online (Sandbox Code Playgroud)

但是,您似乎正在尝试清理旧requirements.txt文件。在这种情况下,pipreqs还带有一个--diff标志,还有一个--clean标志。来自文档:

--diff <file>         Compare modules in requirements.txt to project imports.
--clean <file>        Clean up requirements.txt by removing modules that are not imported in project.
Run Code Online (Sandbox Code Playgroud)

您可以使用它--diff来确定需要删除哪些库,并--clean自动执行此操作。


Gin*_*pin 1

如果您使用的是虚拟环境并且有一个足够好的测试套件,您可以重复自动运行(最好可以通过脚本或简单命令在本地工作区上运行它),那么暴力类型的方法是:

  1. 设置项目的新副本(例如,git clone到单独的文件夹中)
  2. 设置一个空的/空白的虚拟环境
  3. 运行您的测试
  4. 每次遇到“ModuleNotFoundError”类型的错误时安装缺少的软件包
  5. 重复直到所有测试通过
  6. 将您现在拥有的包导出到单独的requirements.txt文件(或自动创建requirements.txtpip freeze > requirements.new.txt中的任何其他方式 )

例如,我们有这个(非常)最小的示例代码:

# --- APP CODE

from numpy import array
from openpyxl import Workbook
from pydantic import BaseModel, ValidationError

class MyModel(BaseModel):
    x: int

# --- TEST CODE

import pytest

def test_my_model():
    with pytest.raises(ValidationError):
        MyModel(x="not an int")
Run Code Online (Sandbox Code Playgroud)

克隆它并设置一个全新的虚拟环境(但尚未安装任何软件包)后,第一次尝试运行测试会产生:

# --- APP CODE

from numpy import array
from openpyxl import Workbook
from pydantic import BaseModel, ValidationError

class MyModel(BaseModel):
    x: int

# --- TEST CODE

import pytest

def test_my_model():
    with pytest.raises(ValidationError):
        MyModel(x="not an int")
Run Code Online (Sandbox Code Playgroud)

那么,你安装pytest

然后,你得到:

(my_venv) $ pytest --maxfail=1 main.py
bash: /Users/me/.venvs/my-proj-7_w3b8eb/bin/pytest: No such file or directory
Run Code Online (Sandbox Code Playgroud)

然后你安装numpy

然后,你得到:

(my_venv) $ pytest --maxfail=1 main.py
...
main.py:1: in <module>
    from numpy import array
E   ModuleNotFoundError: No module named 'numpy'
Run Code Online (Sandbox Code Playgroud)

然后你安装openpyxl

...等等。直到所有测试通过。当然,即使您的自动化测试通过了,最好进行一些手动基本测试,以确保一切确实像以前一样工作。最后,生成 requests.txt 文件的新副本,并将其与旧副本进行比较,以检查是否存在任何差异。

当然,正如我在开始时提到的,这假设您有一个足够好的测试套件来测试大部分代码和用例。(这也是您应该首先编写测试的充分理由之一。)。