小编典典

检查我的Python是否具有所有必需的软件包

python

我有一个requirements.txt文件,其中列出了我的虚拟环境所需的软件包。是否有可能找出文件中提到的所有软件包是否都存在。如果缺少某些软件包,如何找出丢失的软件包?


阅读 249

收藏
2021-01-20

共1个答案

小编典典

更新

进行更新和改进的方法是通过distutils.text_file.TextFile。有关详细信息,请参见Acumenus答案。

根据Zaur的回答,假设您确实使用了需求文件,则可能需要进行单元测试(可能在中)tests/test_requirements.py,以确认软件包的可用性。

此外,此方法使用子测试独立确认每个要求。这很有用,以便记录所有故障。如果没有子测试,则仅记录单个失败。

"""Test availability of required packages."""

import unittest
from pathlib import Path

import pkg_resources

_REQUIREMENTS_PATH = Path(__file__).parent.with_name("requirements.txt")


class TestRequirements(unittest.TestCase):
    """Test availability of required packages."""

    def test_requirements(self):
        """Test that each required package is available."""
        # Ref: https://stackoverflow.com/a/45474387/
        requirements = pkg_resources.parse_requirements(_REQUIREMENTS_PATH.open())
        for requirement in requirements:
            requirement = str(requirement)
            with self.subTest(requirement=requirement):
                pkg_resources.require(requirement)

原文

这样做的pythonic方法是通过pkg_resources
API。要求以setuptools可以理解的格式编写。例如:

Werkzeug>=0.6.1
Flask
Django>=1.3

示例代码:

import pkg_resources
from pkg_resources import DistributionNotFound, VersionConflict

# dependencies can be any iterable with strings, 
# e.g. file line-by-line iterator
dependencies = [
  'Werkzeug>=0.6.1',
  'Flask>=0.9',
]

# here, if a dependency is not met, a DistributionNotFound or VersionConflict
# exception is thrown. 
pkg_resources.require(dependencies)
2021-01-20