如何使用 pipenv 检查已安装的软件包是否匹配 Pipfile.lock?

How can I check that the installed packages match Pipfile.lock using pipenv?

在我的测试中,我想 运行 一个命令来确保我的虚拟环境中安装的包与 Pipfile.lock 中找到的包相匹配。

有这样的命令吗?

pipenv checkifinstalled || exit 1

这个问题可以简化为以下两个步骤:

  1. Pipfile.lock转换为requirements.txt文件(采用pip freeze生成的格式)。

    • 运行pipenv requirements(或pipenv requirements --dev)很容易做到这一点。 (注意pipenv >= 2022.4.8支持此命令)
  2. 检查安装的包是否与生成的 requirements.txt 文件匹配。

    • 在这个问题下找到了解决方案:Check if my Python has all required packages

实施:

以下是我在测试中将所有内容放在一起的方法:

import pkg_resources
import subprocess
import unittest

class DependencyChecks(unittest.TestCase):
    def test_requirements_installed(self):
        requirements_lines = subprocess.check_output(["pipenv", "requirements", "--dev"], text=True).splitlines()
        req_lines = [line for line in requirements_lines if not line.startswith("-i ")]
        requirements = pkg_resources.parse_requirements(req_lines)
        for requirement in requirements:
            req = str(requirement)
            with self.subTest(requirement=req):
                pkg_resources.require(req)