Подтвердить что ты не робот

Как я могу отслеживать импорт python

У меня возникли циклические проблемы с импортом, добавив новый код в очень большое приложение, и я пытаюсь определить, какие файлы являются наиболее вероятными причинами этого. Это там какой-нибудь способ отслеживать, какие файлы импортируют какие файлы? Я немного искал и нашел команду трассировки python, но она просто показывала кучу активности в основных библиотеках python.

Я в основном ищу приложение, которое покажет мне что-то вроде:

App1 >>imports>> App2,App3.method
App2 >>imports>> App3,etc

Я мог бы просто просмотреть все мои файлы, но я бы предпочел, это большое приложение.

4b9b3361

Ответ 2

Вот простой (и немного рудиментарный;-) способ отслеживать "кто пытается импортировать что" в терминах имен модулей:

import inspect
import __builtin__
savimp = __builtin__.__import__

def newimp(name, *x):
  caller = inspect.currentframe().f_back
  print name, caller.f_globals.get('__name__')
  return savimp(name, *x)

__builtin__.__import__ = newimp

который дает, например (сохраняя это как tracimp.py):

$ python -c 'import tracimp; import email; import sys; import email.mime'
email __main__
sys email
email.mime email
sys __main__
email.mime __main__

Как вы видите, одна особенность "обертывания" встроенного __import__ заключается в том, что он не будет блокирован тем фактом, что импортируемый модуль уже находится в sys.modules: поскольку забота об этом один из __import__ заданий, наша оболочка вызывается для того, чтобы оба модуля "были загружены в первый раз" и, которые только собираются получить из sys.modules, потому что они уже были импортированы ранее. Это должно пригодиться, когда вы пытаетесь диагностировать циклический импорт (он сводится к поиску циклов в ориентированном графе, чьи ребра идентифицируются двумя именами модулей - импортом и импортером - который этот простой подход печатает на каждом выходная линия).

Ответ 3

Попробуйте использовать python -v для запуска вашей программы. Он будет отслеживать последовательность импорта.

Другим вариантом является pylint, который предупредит вас обо всех проблемах, включая циклический импорт.

Ответ 5

Несколько ответов здесь упоминают змеиная еда

Это хорошо сработало для меня, но, к сожалению, когда количество импорта слишком велико, тогда график, сгенерированный sfood-graph, становится беспорядочным, и очень трудно отследить границы. (Представьте себе, что вы пытаетесь отследить аудиоразъем до наушника в 10 наушниках).

Я модифицировал утилиту sfood-граф здесь, так что график генерироваться дает случайные и высокие-контрастные цвета к краям, что делает его более легким для вас отслеживать узлы.

Ответ 6

Невозможно получить циклический импорт в python, потому что он проверяет, был ли модуль уже импортирован, прежде чем импортировать его снова. Вы можете импортировать модуль только один раз, независимо от того, сколько раз вы вызываете импорт.

От http://groups.google.com/group/comp.lang.python/browse_thread/thread/1d80a1c6db2b867c?pli=1:

Импорт довольно прост действительно. Просто запомните следующее:

'import' и 'from xxx import yyy' являются исполняемые операторы. Они выполняют когда запущенная программа достигает этого линия.

Если модуль отсутствует в sys.modules, то импорт создает новый модуль запись в sys.modules, а затем выполняется код в модуле. Это не обратное управление вызывающему модулю пока выполнение не завершится.

Если модуль существует в sys.modules то импорт просто возвращает это модуль, завершил ли он выполнения. Вот почему циклический импорт может возвращать модули которые кажутся частично пустыми.

Наконец, выполнение script выполняется в модуль с именем __main__, импортирующий script под своим именем создаст новый модуль, не связанный с __main __.

Возьмите эту партию вместе, и вы не должны удивлять, когда импорт модулей.