Los módulos pueden se importan cíclicamente entre sí, pero hay una trampa. En el caso simple, debería funcionar moviendo las declaraciones import
al final del archivo o no usando la sintaxis from
.
He aquí por qué esto funciona:
Al importar un módulo, Python comprueba primero sys.modules
. Si está allí, simplemente importa desde allí. Si no está allí, intenta importarlo de la manera normal; básicamente, encuentra el archivo y ejecuta las cosas en él.
Al ejecutar un módulo se rellena el contenido del módulo. Por ejemplo, digamos que tenemos este módulo, de manera creativa nombrado example_opener
:
import webbrowser
def open_example():
webbrowser.open('http://www.example.com/')
Al inicio, el módulo está vacía. Luego ejecuta Python:
import webbrowser
Después de eso, el módulo sólo contiene webbrowser
. Entonces Python ejecuta esto:
def open_example():
webbrowser.open('http://www.example.com/')
Python crea open_example
. Ahora el módulo contiene webbrowser
y open_example
.
Di webbrowser
contenían este código:
from example_opener import open_example
def open(url):
print url
Say example_opener
se importa en primer lugar. Este código se ejecuta:
import webbrowser
webbrowser
aún no ha sido importado, lo que Python ejecuta el contenido de webbrowser
:
from example_opener import open_example
example_opener
ha sido importado, pero aún no se ejecuta completamente. Python no le importa. Python saca el módulo de sys.modules
. En este punto, example_opener
todavía está vacío. Todavía no ha definido open_example
, ni ha completado la importación de webbrowser
. Python no puede encontrar open_example
en example_opener
, por lo que falla.
¿Qué pasa si importamos open_example
desde el final de webbrowser
y webbrowser
desde el final de example_opener
? Python comenzaría mediante la ejecución de este código:
def open_example():
webbrowser.open('http://www.example.com/')
webbrowser
aún no existe, pero no importa hasta open_example
se llama. Ahora example_opener
contiene solo open_example
. A continuación, ejecuta:
import webbrowser
que no se ha importado todavía, así que Python ejecuta webbrowser
. Comienza:
def open(url):
print url
Define open
. A continuación, se ejecuta:
from example_opener import open_example
example_opener
está en sys.modules
, por lo que utiliza eso. example_opener
contiene open_example
, por lo que tiene éxito. Python termina de importar webbrowser
. Eso concluye importando webbrowser
de example_opener
. Eso es lo último en example_opener
, por lo que la importación de example_opener
finaliza, también.
Como se explica en mi respuesta, es posible que los módulos se importen entre sí, pero si necesita hacerlo, puede que desee reconsiderar su diseño. – icktoofay
Creo que esta explicación es mucho más fácil de entender: http://stackoverflow.com/questions/9642451/python-files-import-from-each-other – rizkiaditya24