la ruta relativa no funciona incluso con __init__.py

Sé que hay un montón de preguntas similares sobre el desbordamiento de stack. Pero la respuesta común no parece estar funcionando para mí.

Tengo una estructura de archivos como esta

proj/ lib/ __init__.py aa.py bb.py test/ __init__.py aa_test.py 

Pensé que si incluyo el código en mi test.py

 import lib.aa 

o

 from lib import aa 

Podría hacer referencia a los módulos en el directorio lib/ . Pero eso no funcionó.

Así que intenté agregar a la ruta, y la agrega correctamente:

 os.environ["PATH"] += ":%s" % os.path.abspath(os.path.join("..","")) print os.environ["PATH"] 

pero incluso ahora cuando bash las instrucciones de importación anteriores … Sigo recibiendo el error

 ImportError: No module named aa 

o

 ImportError: Importing from non-package  

¿Hay algo obvio que me estoy perdiendo?

¿Hay alguna forma de comprobar si he configurado correctamente mis archivos __init__.py o ver la jerarquía de mi paquete?

sys.path actualizar su sys.path , que es donde Python busca módulos, a diferencia de la ruta de su sistema en el entorno actual, que es a lo que se os.environ["PATH"] .

Ejemplo:

 import os, sys sys.path.insert(0, os.path.abspath("..")) import aa 

Después de hacer esto, puedes usar tus funciones en aa así: aa.myfunc()

Hay más información en la respuesta aceptada para python: importar un módulo desde un directorio

El directorio lib debe estar en la ruta de búsqueda del módulo de Python, que no es lo mismo que la ruta de búsqueda que usa tu shell.

Esto probablemente funcionará para usted:

 import sys, os sys.path.append(os.path.abspath("..")) 

Sin embargo, es probable que sea mejor ejecutar su código desde un contexto donde el paquete lib ya está en la ruta. Por ejemplo, desde el directorio ‘proyecto’.

¿De dónde es el código desde el que intentas importar lib.aa? Supongo que / proj / no es su directorio de trabajo y debería ser como está configurado en este momento. En lugar de PATH, desearía agregar su directorio a PYTHONPATH para que aparezca en la ruta de búsqueda para una importación. Consulte http://docs.python.org/tutorial/modules.html#the-module-search-path

También, visite http://as.ynchrono.us/2007/12/filesystem-structure-of-python-project_21.html Se recomienda encarecidamente que coloque un nivel adicional de directorio en su lugar, en lugar de lib.aa , usted lo llamaría my_proj.lib.aa .

Tuve problemas similares y aquí está mi consejo.

En lugar de cambiar sys.path , es mejor que ejecute su test.py para que no esté en el directorio proj (es decir, la raíz del proyecto). De esta forma, el directorio del proyecto estará automáticamente en sys.path y podrá importar el paquete lib .

Y usar las importaciones absolutas.

La variable PATH del sistema no es utilizada por la statement de importación de Python. Utiliza PYTHONPATH, pero la mejor manera de agregar un nuevo directorio para importar la ruta de búsqueda es modificar sys.path.

Si esto no funciona, agregue a la pregunta su valor de sys.path y el valor devuelto por os.getcwd ().