Esta es mi jerarquía de paquetes
app |--__init__.py //Empty file |--server.py |--global_vars.py | |--handlers |--__init__.py //Empty file | |--url1 | |--__init__.py //Empty file | |--app1.py | |--app2.py | |--url2 |--__init__.py //Empty file |--app3.py
Ahora quiero importar global_vars.py
dentro de app1.py
Así que di import app.global_vars.py
dentro de app1.py.
Pero me sale el siguiente error:
import app.global_vars ImportError: No module named app.global_vars
También debo mencionar que estoy importando app1.py desde server.py. server.py
es el archivo que realmente estoy ejecutando. Cuando server.py importa app1.py, app1.py
intenta importar global_vars.py
y obtengo el error mencionado anteriormente
¿Qué estoy haciendo mal aquí?
Si está ejecutando app/server.py
como un script, el directorio principal de la app
no se agrega a sys.path()
. El directorio de la app
se agrega en su lugar (no como un paquete sino como una ruta de búsqueda de importación).
Tienes 4 opciones:
server.py
fuera del paquete de la app
(junto a él) Agregue un nuevo archivo de script junto a la app
que solo se ejecuta:
from app import server server.main()
Use la opción de interruptor -m
para ejecutar un módulo como el punto de entrada principal:
python -m app.server
Agregue el directorio principal de server.py
a sys.path
:
import os.path import sys parent = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.insert(0, parent)
Esta última opción puede introducir más problemas sin embargo; ahora, tanto el paquete de la app
como los módulos contenidos en el paquete de la app
están en sys.path
. Puede importar app.server
y server
y Python los verá como dos módulos separados, cada uno con su propia entrada en sys.modules
, con copias separadas de sus globales.
necesita el archivo __init__.py
, lo considerará como un paquete
aplicación
| –server.py
| –global_vars.py
|
| – __init__.py
…
__init__.py
puede estar vacío