Может ли distutils выполнить проверку зависимостей без установки? - PullRequest
4 голосов
/ 06 декабря 2011

Возможно ли, чтобы distutils просто выполнял анализ зависимостей модуля python (и, возможно, устанавливал отсутствующие модули) без фактической установки соответствующего модуля python? Я представляю команду следующим образом:

./setup.py check-dependencies

, который будет сообщать, если в целевой системе отсутствуют какие-либо зависимые модули.

Ответы [ 3 ]

5 голосов
/ 07 декабря 2011

Зависимости в Python-упаковке - запутанная тема.Долгое время единственным стандартом был PEP 314, который определяет параметр requires, provides и obsoletes для функции distutils.core.setup.Элементы, используемые для этих аргументов, - это имя модуля Python, например provides=['xml', 'xml.utils'].PEP не очень ясно понимал зависимости стандартной библиотеки (должен ли я зависеть от Python> = 2.5 или мне нужно 'xml'?), И, как оказалось, не было инструмента, который бы использовал эти поля (недаже отвлекается сам).

Потом пришли setuptools.Он ввел другие виды зависимостей, которые использовали проект имена вместо modules , поэтому, например, вы можете иметь setup(..., install_requires=['PyXML', 'Pylons'], tests_require=['nose']), что гораздо полезнее: люди выпускают программное обеспечение на PyPI, используя уникальный проектимена, и вы можете использовать эти же имена в своем скрипте установки, чтобы зависеть от них, и с помощью easy_install или pip вы установите эти зависимости, модули, скрипты и все.

Когда поводья distutils снова были поднятыНесколько лет назад сообщество стандартизировало идею установки зависимостей для создания PEP 345, которая теперь реализована в distutils2 и предназначена для замены distutils и setuptools.

Подводя итог, можно сказать:Зависимости уровня модуля в стиле distutils в вашем скрипте установки, которые бесполезны - у вас могут быть deps уровня проекта в стиле setuptools, которые используются инструментами на основе setuptools - вы можете иметь PEP 345-совместимые deps уровня проекта в setup.cfg файл, который используется distutils2

Итак, чтобы позволить намОтветьте на свой вопрос, вы должны сказать нам, какой у вас есть.Во всех практических вопросах не следует использовать deps модуля в стиле distutils, поэтому он оставляет проект deps в стиле setuptools или новый стиль PEP 345, которые все еще являются новыми и еще не получили широкого распространения.distutils2 имеет слой compat для setuptools, поэтому его можно использовать для получения необходимой информации из сценария setup.py на основе setuptools.

Не связанного с инструментами упаковки, есть также инструмент, которыйМожно сканировать ваш код, чтобы найти используемые вами модули: это модуль modulefinder в стандартной библиотеке, который не очень известен или используется, судя по печальному состоянию его кода.Этот инструмент не сообщит вам, был ли используемый модуль взят из stdlib или стороннего проекта, и не может сказать вам имя проекта для использования в вашем файле setup.py или setup.cfg.

НТН

3 голосов
/ 06 декабря 2011

Я думаю, что самое близкое, что вы можете получить, это:

setup.py install -v -n

, что означает запуск пробного прогона (-n) в многословном (-v) режиме.

Вытакже можно использовать модуль distuitls.dep_util , однако он не будет работать как опция setup.py.

HTH!

0 голосов
/ 07 декабря 2011

distutils.dep_util касается файловых зависимостей (то есть, если somefile.c новее somefile.o, то somefile.o необходимо перекомпилировать), а не проектных зависимостей. [хотел добавить это как комментарий к другому ответу, но, очевидно, кнопка Добавить комментарий добавляет ответ?]

...