web-dev-qa-db-ja.com

私のPythonに必要なすべてのパッケージがあるかどうかを確認します

requirements.txt仮想環境に必要なパッケージのリストを含むファイル。ファイルに記載されているすべてのパッケージが存在するかどうかを確認することは可能ですか?一部のパッケージが不足している場合、不足しているパッケージを見つける方法は?

24
Alagappan Ramu

[〜#〜]更新[〜#〜]

これを行うための最新の改善された方法は、distutils.text_file.TextFile。詳細については、以下のAcumenusの answer を参照してください。

[〜#〜]元の[〜#〜]

それを行う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)
48
Zaur Nasibov

pip freezeを実行して、インストールした内容を確認し、requirements.txtファイルと比較できます。

不足しているモジュールをインストールする場合は、pip install -r requirements.txtを実行すると、不足しているモジュールがインストールされ、不足しているモジュールとインストールされているモジュールが最後に通知されます。

19
John Jiang

Zaurによる回答 に基づいて、実際に要件ファイルを使用すると仮定すると、おそらくtests/test_requirements.py、パッケージの可用性を確認します。

さらに、このアプローチでは サブテスト を使用して、各要件を個別に確認します。これは、すべての障害を文書化するのに役立ちます。

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

import distutils.text_file
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 = distutils.text_file.TextFile(filename=str(_REQUIREMENTS_PATH)).readlines()
        for requirement in requirements:
            with self.subTest(requirement=requirement):
                pkg_resources.require(requirement)

ご了承ください distutils.text_file.TextFileはコメントを削除します。


Python 3もちろん含まれています distutils.text_file

>>> import sys
>>> sys.version
'3.8.0 (default, Oct 28 2019, 16:14:01) \n[GCC 8.3.0]'
>>> sys.modules['distutils.text_file']
<module 'distutils.text_file' from '/usr/lib/python3.8/distutils/text_file.py'>
>>> import distutils.text_file
7
Acumenus

コマンドラインからこれを行うことに興味がある場合は、pip-missing-reqsは不足しているパッケージをリストします。例:

$ pip-missing-reqs directory
Missing requirements:
directory/exceptions.py:11 dist=grpcio module=grpc

pip checkおよびpipdeptree --warn failチェックなしで、相互の互換性についてインストール済みパッケージのみを監査しますrequirements.txt。)

0
cov