Importar módulos de Python desde un paquete de nivel superior

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:

  1. Mueve server.py fuera del paquete de la app (junto a él)
  2. Agregue un nuevo archivo de script junto a la app que solo se ejecuta:

     from app import server server.main() 
  3. Use la opción de interruptor -m para ejecutar un módulo como el punto de entrada principal:

     python -m app.server 
  4. 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