El problema es que cuando se ejecuta desde un directorio, de manera predeterminada solo los paquetes que son subdirectorios son visibles como importaciones de candidatos, por lo que no puede importar a.b.d. Sin embargo, puede importar b.d. ya que b es un sub paquete de a.
Si realmente desea importar a.b.d en c/__init__.py
puede lograr esto cambiando la ruta del sistema para que sea un directorio sobre a y cambie la importación en a/__init__.py
para importar a.b.c.
Su a/__init__.py
debería tener este aspecto: surge
import sys
import os
# set sytem path to be directory above so that a can be a
# package namespace
DIRECTORY_SCRIPT = os.path.dirname(os.path.realpath(__file__))
sys.path.insert(0,DIRECTORY_SCRIPT+"/..")
import a.b.c
Una dificultad adicional cuando se desea ejecutar módulos en C como guiones. Aquí los paquetes a y b no existen. Puede hackear el __int__.py
en el directorio c para apuntar sys.path al directorio de nivel superior y luego importar __init__
en cualquier módulo dentro de c para poder usar la ruta completa para importar a.b.d. Dudo que sea una buena práctica importar __init__.py
, pero ha funcionado para mis casos de uso.
¿Tal vez podría probar las importaciones relativas? http://stackoverflow.com/questions/72852/how-to-do-relative-imports-in-python – eremzeit
esto puede ayudar a https://ncoghlan_devs-python-notes.readthedocs.org/en /latest/python_concepts/import_traps.html – maazza
también como referencia, parece que las importaciones circulares están permitidas en Python 3.5 (y probablemente más allá) pero no 3.4 (y probablemente más abajo). –