Как я могу отслеживать импорт Python - PullRequest
20 голосов
/ 28 ноября 2009

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

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

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

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

Ответы [ 5 ]

14 голосов
/ 28 ноября 2009

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

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, потому что они уже были импортированы ранее. Это должно пригодиться, когда вы пытаетесь диагностировать циклический импорт (все сводится к поиску циклов в ориентированном графе, ребра которого идентифицируются двумя именами модулей - импортированным и импортирующим), которые этот простой подход печатает на каждом выходная строка).

11 голосов
/ 28 ноября 2009

Вы можете использовать один из этих сценариев для создания графиков зависимостей модуля Python:

9 голосов
/ 28 ноября 2009

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

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

1 голос
/ 20 апреля 2015

Может быть поздно, но вы обязательно должны взглянуть на

https://github.com/boris-42/profimp

enter image description here

0 голосов
/ 28 ноября 2009

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

С 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 тогда импорт просто возвращает это модуль независимо от того, завершен он или нет выполнения. Вот почему циклический импорт может вернуть модули которые кажутся частично пустыми.

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

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

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