Как получить версию зависимостей / модулей Python, включая внешние приложения, вызываемые через subprocess.Popen? - PullRequest
2 голосов
/ 25 января 2010

У меня есть набор сценариев Python, которые я часто запускаю на разных машинах, которые зависят от нескольких внешних библиотек, а также от некоторых других приложений, созданных с помощью subprocess.Popen.

Как и следовало ожидать, в зависимости от версии установленных модулей и приложений, выходной сигнал меняется. Для решения этой проблемы я хотел бы отслеживать, какие версии использовались во время выполнения.

Для этого я рассмотрел следующие шаги:

  1. Использование modulefinder для сбора зависимостей.
  2. Попробуйте позвонить module.__version__, module.get_version() или другой общий способы хранения информации о версии на каждом собранном модуле.
  3. Соберите все вызовы на subprocess.Popen и попытайтесь получить номер версии, проанализировав выходные данные с различными аргументами, такими как -version, -v, - ?, -h, ...

Шаги 2 и 3 могут быть значительно улучшены с помощью специальных утилит ( Debian в моем случае), таких как dpkg , для получения версий установленных пакетов. Недостатком является то, что он становится не только ОС, но и специфичным для дистрибутива, однако я понимаю, что первоначальный подход крайне неэффективен и подвержен ошибкам, если вообще функционален.

Так что мой вопрос: есть ли какой-нибудь пакет для решения этой проблемы или у кого-нибудь есть лучшее предложение о том, как его реализовать?

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Прошло два года, и в игру вступили новые инструменты.

Чтобы позаботиться о пунктах 1 и 2, теперь есть pip freeze, особенно в сочетании с virtualenv.

Для внешних приложений мне пришлось обратиться к менеджеру пакетов (apt-file, dpkg, qlist, emerge, ... в зависимости от системы) в системе, которая включала все ожидаемые ловушки.

Я все же хотел бы сослаться на ответ Росса, поскольку он дал желаемый результат. Недостаток (с моей точки зрения) состоит в том, что в нем собрано гораздо больше зависимостей, чем строго требуется.

0 голосов
/ 25 января 2010

Вместо непосредственного исследования ваших зависимостей в python, и если вы работаете в Linux / Unix, вы можете обернуть вашу программу с memoize.py. memoize.py использует strace, или «системную трассировку», для просмотра всех системных команд чтения и записи, которые генерирует ваша программа, а затем сохраняет эти зависимости в файле. memoize.py также может использоваться в качестве библиотеки, поэтому вы можете использовать ее функции внутри вашей программы и получать зависимости в структуре данных Python.

...