Как проверить, есть ли у моего Python все необходимые пакеты?

У меня есть файл requirements.txt со списком пакетов, необходимых для моей виртуальной среды. Можно ли узнать, присутствуют ли все пакеты, упомянутые в файле. Если некоторые пакеты отсутствуют, как узнать, какие недостающие пакеты?

Ответ 1

Питонический способ сделать это через 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)

Ответ 2

Вы можете запустить pip freeze, чтобы узнать, что вы установили, и сравнить его с вашим файлом requirements.txt.

Если вы хотите установить отсутствующие модули, вы можете запустить pip install -r requirements.txt и установить какие-либо недостающие модули и сообщить вам в конце, какие из них отсутствовали и были установлены.

Ответ 3

В соответствии с ответом Zaur, если вы действительно используете файл requirements.txt, вам может понадобиться unit test, возможно, в tests/test_requirements.py, который подтверждает доступность пакетов.

Общий подход:

import pathlib
import unittest

import pip
import pkg_resources


class TestRequirements(unittest.TestCase):

    def test_requirements(self):  # pylint: disable=no-self-use
        """Recursively confirm that requirements are available.

        This implementation is tested to be compatible with pip 9.0.1.
        """
        requirements_path = pathlib.Path(__file__).parents[1] / 'requirements.txt'
        requirements = pip.req.parse_requirements(str(requirements_path), session=pip.download.PipSession())
        requirements = [str(r.req) for r in requirements]
        pkg_resources.require(requirements)

Обратите внимание, что в этом ответе используется pathlib, который доступен в Python 3, но не в Python 2. Если вы используете Python 2, сначала установите для него backport, который pathlib2.

Ответ 4

Вы можете создать virtualenv с доступом к пакетам сайта системы и проверить, установлен ли пакет (или другие зависимости) или нет. Таким образом, пакеты на самом деле не установлены (если вы просто хотите проверить). Пример использования virtualenv wrapper был бы следующим:

$ cat requirements.txt 
requests
simplejson

$ mkvirtualenv --system-site-packages test
Running virtualenv with interpreter /usr/bin/python2
New python executable in test/bin/python2
Also creating executable in test/bin/python
Installing setuptools, pip...done.

$ pip install -r requirements.txt
Downloading/unpacking requests (from -r requirements.txt (line 1))
  Downloading requests-2.10.0-py2.py3-none-any.whl (506kB): 506kB downloaded
Requirement already satisfied (use --upgrade to upgrade): simplejson in /usr/lib/python2.7/dist-packages (from -r requirements.txt (line 2))
Installing collected packages: requests
Successfully installed requests
Cleaning up...

$ pip install -r requirements.txt
Requirement already satisfied (use --upgrade to upgrade): requests in /home/yucer/.virtualenvs/test/lib/python2.7/site-packages (from -r requirements.txt (line 1))
Requirement already satisfied (use --upgrade to upgrade): simplejson in /usr/lib/python2.7/dist-packages (from -r requirements.txt (line 2))
Cleaning up...

$ deactivate

$ rmvirtualenv test
Removing test...

Ответ 5

Если require.txt похож:

django
oursql
sys
notexistingmodule

Тогда следующий script расскажет вам, какие модули отсутствуют:

#!/usr/bin/python3
fname = 'requirements.txt'
with open(fname, 'r', encoding='utf-8') as fhd:
    for line in fhd:
        try:
            exec("import " + line)
        except:
            print("[ERROR] Missing module:", line)

Это будет печатать:

[ERROR] Missing module: notexistingmodule