检查我的Python是否安装了所有所需的软件包

11 浏览
0 Comments

检查我的Python是否安装了所有所需的软件包

我有一个包含必需软件包列表的requirements.txt文件,这些软件包是我虚拟环境所需的。是否可以判断文件中提到的所有软件包是否存在?如果有一些软件包缺失,如何找出缺失的软件包?

0
0 Comments

当我们在使用Python编程时,有时会遇到一些代码依赖于特定的包或模块的情况。如果我们的Python环境缺少这些必需的包,就会导致程序无法正常运行。为了解决这个问题,我们可以使用一些方法来检查我们的Python环境是否已安装了所有所需的包,并根据需要进行安装。

一种方法是运行pip freeze命令,它可以显示已安装的所有包,并将其与我们的requirements.txt文件进行比较。这样我们就可以知道我们已经安装了哪些包,以及它们的版本号。

另一种方法是运行pip install -r requirements.txt命令,它会读取requirements.txt文件中列出的包,并安装缺少的包。在安装过程中,它会告诉我们哪些包是缺少的,并在安装完成后通知我们已经安装了哪些包。

通过这两种方法,我们可以很方便地检查我们的Python环境是否已安装了所有所需的包,并根据需要进行安装。这样可以确保我们的代码能够正常运行,而不会因为缺少依赖包而出错。

0
0 Comments

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

在Stack Overflow的一个回答中,假设您确实使用了一个要求文件,您可能希望进行一个单元测试,例如在`tests/test_requirements.py`中,以确认包的可用性。

此外,该方法使用了一个`subtest`来独立确认每个要求。这样做是有用的,这样所有的失败都有记录。如果没有subtests,只有一个失败被记录。

"""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)

这真是一个好主意!

更新了被接受的答案,并引用了你的答案。

.Ilma,使用subtests,您可以确切地知道失败的所有要求子集,因此在测试时经常很有用。如果没有subtests,您只知道第一个失败。

当我运行测试时,我遇到了错误`AttributeError: module 'distutils' has no attribute 'text_file'`,当我检查`distutils`源代码时,我没有找到`text_file`,我正在使用Python 3.6.9,感谢您的及时回复,我刚刚在这里添加了一些细节,以及我找到的解决方案(抱歉,我在Python版本上犯了一个错误,它是3.6.9)。

可以使用`setuptools`自己的`pkg_resources.parse_requirements`,而不是`distutils.text_file.TextFile`,就像这个例子中所示:stackoverflow.com/a/59971236/11138259

实际上,这个答案过去使用的是`pkg_resources.parse_requirements`,您可以在其编辑历史中确认。我不得不停止使用它,因为它的API非常不稳定,经常会出现问题。现在我又根据您的建议再次编辑了答案,回到了使用它。

我明白了,我记得以前曾经被告知过那个API有点不可靠,不记得具体细节了。无论如何,我很感激人们努力使他们的答案保持最新,谢谢。

在`for`循环内安装缺少的包是否可能?

-Kabbali 即使可能,这是非常非标准的做法。包应该由包管理器(例如pip、poetry、conda等)管理,因此应该运行相同的包。然而,标准的工作流程是首先安装定义的包列表(根据所选择的包管理器的使用说明),然后运行单元测试。

这种方法无法处理引用的文件(例如在`requirements-dev.txt`文件中的`-r requirements.txt`)。这会产生解析错误,需要更多的工作来使其工作。

注意,但是我没有多大理由在`requirements-dev.txt`中引用`requirements.txt`,因为我可以使用`pip install -U -r ./requirements.txt -r ./requirements-dev.txt`一条命令来同时安装两者。

非常感谢您的答案,这对我帮助很大。在尝试理解代码时,我看到根据`setuptools`文档,`pkg_resources`已经被弃用,必须替换为`importlib`,但是我在这个库中找不到任何等效于`parse_requirements`的函数,有什么建议吗?

0
0 Comments

问题的原因是需要检查Python是否安装了所需的包。解决方法是使用pkg_resources API来实现。您可以将所需的包以特定的格式写入一个列表,然后使用pkg_resources.require函数来检查是否满足这些依赖关系。如果依赖关系未满足,将抛出DistributionNotFoundVersionConflict异常。您还可以使用try-except语句来捕获异常并打印出所有缺少的依赖项。

更新的方法使用了distutils.text_file.TextFile,可以更好地实现此功能。您可以参考链接中的答案以了解更多详情。

总结起来,要检查Python是否安装了所需的包,您可以使用pkg_resources API,并将依赖关系以特定的格式写入一个列表,然后使用pkg_resources.require函数检查是否满足这些依赖关系。如果未满足依赖关系,将抛出异常。您还可以使用try-except语句来捕获异常并打印出所有缺少的依赖项。

0