как вы статически находите динамически загружаемые модули - PullRequest
2 голосов
/ 16 сентября 2011

Как получить (найти местоположение) динамически импортированные модули из скрипта Python?

Итак, Python, насколько я понимаю, может динамически (во время выполнения) загружать модули.Будь то использование _ import _ (имя_модуля) или использование exec "из x import y" , либо использование imp.find_module ("module_name"") , а затем imp.load_module (param1, param2, param3, param4) .

Зная, что я хочу получить все зависимости для файла python.Это будет включать получение (или, по крайней мере, я пытался) динамически загружаемых модулей, которые загружаются либо с использованием жестко закодированных строковых объектов, либо возвращаемых функцией / методом.

Для обычного import имя_модуля и из x import y вы можете выполнить сканирование кода вручную или использовать module_finder.

Так что если яХотите скопировать один скрипт Python и все его зависимости (включая пользовательские динамически загружаемые модули), как мне это сделать?

Ответы [ 5 ]

3 голосов
/ 16 сентября 2011

Вы не можете;сама природа программирования (на любом языке) означает, что вы не можете предсказать, какой код будет выполнен, фактически не выполняя его.Таким образом, вы не можете сказать, какие модули могут быть включены.

Это еще больше запутывает ввод пользователя, рассмотрим: __import__(sys.argv[1]).

Существует много теоретической информации о первой проблеме., которая обычно описывается как проблема остановки , вторая просто не может быть выполнена.

2 голосов
/ 16 сентября 2011

С теоретической точки зрения вы никогда не сможете точно знать, какие / куда модули импортируются. С практической точки зрения, если вы просто хотите узнать, где находятся модули, проверьте атрибут module.__file__ или запустите сценарий в разделе python -v, чтобы найти файлы при загрузке модулей. Это не даст вам каждый модуль, который может быть загружен, но получит большинство модулей с в основном нормальным кодом.

См. Также: Как найти расположение исходных текстов модуля Python?

1 голос
/ 16 сентября 2011

Просто идея, и я не уверен, что она будет работать:

Вы можете написать модуль, который содержит оболочку для __builtin__.__import__. Эта оболочка сохранит ссылку на старый __import__, а затем назначит __builtin__.__import__ функцию, которая выполняет следующие действия:

  1. при каждом вызове получить текущую трассировку стека и обработать вызывающую функцию. Возможно, информации в параметре globals для __import__ достаточно.
  2. получить модуль этих вызывающих функций и сохранить имя этого модуля и то, что будет импортировано
  3. переадресация вызова на реальный __import__

После того, как вы это сделаете, вы можете позвонить в вашу заявку с помощью python -m magic_module yourapp.py. Магический модуль должен хранить информацию где-то, где вы сможете получить ее позже.

1 голос
/ 16 сентября 2011

Это невозможно сделать на 100% точно.Я ответил на аналогичный вопрос здесь: Тестирование зависимостей с Python

0 голосов
/ 16 сентября 2011

Это довольно большой вопрос.

Статический анализ предназначен для прогнозирования всех возможных путей выполнения во время выполнения и обеспечения того, чтобы программа вообще остановилась для конкретного ввода.

Что эквивалентно Проблема остановки и, к сожалению, нет универсального решения.

Единственный способ разрешить динамические зависимости - запустить код.

...