2016-11-10 5 views
0

У меня проблема с отладчиком, когда некоторые модули в моем коде называют друг друга. Практический пример:Python spyder debug freezes с циклическим импортом

Файл dog.py содержит следующий код:

import cat 
print("Dog") 

Файл cat.py заключается в следующем:

import dog 
print("Cat") 

Когда я бегу dog.py (или кошка .py) У меня нет проблем, и программа работает гладко. Однако, когда я пытаюсь его отладить, весь spyder замерзает, и я должен убить программу.

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

Спасибо!

ответ

2

Когда я запустил dog.py (или cat.py), у меня нет проблем, и программа работает плавно.

AFAICT, что в основном потому, что сценарий импортируется под особым именем ("__main__"), в то время как модуль импортируется под его собственным именем (здесь «собака» или «кошки»). NB: на самом деле загружается только различие между скриптом и модулем - передается аргумент во время выполнения python (python dog.py) или импортируется из скрипта или любого модуля с оператором import.

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

Чтобы сделать длинную историю Короче говоря, для этого конкретного использования, за исключением (что на самом деле больше связано с побочным эффектом), Python делает не поддерживает циркулярный импорт. Если у вас есть функции (классы, что угодно), используемые другими скриптами или модулями, поместите эти функции в другой модуль. Или, если вы обнаружите, что два модуля действительно зависят друг от друга, вы можете просто перегруппировать их в один модуль (или перегруппировать части, которые зависят друг от друга в одном модуле и все остальное в одном или нескольких других модулях).

Кроме того: если это тривиальная утилита с одним выстрелом или что-то, что зависит только от stdlib, содержимое вашего скрипта часто лучше сводится к main функции синтаксического анализа аргументов командной строки/чтения файлов конфигурации/независимо, импортирования необходимых модулей и начать эффективный процесс.

+0

Спасибо, Бруно. Но почему сценарий не работает только при отладке? В чем разница? – riccio777

+0

@ riccio777 Я не использую spyder, поэтому я не могу сказать, но я предполагаю, что он пытается импортировать ваши модули для проверки (под его настоящим именем модуля) и ошибочно пытается обрабатывать циклический импорт. –

Смежные вопросы