Recibiendo un error de importación: no hay un módulo llamado ***, pero tiene __init__.py

Entiendo que esta pregunta se ha formulado varias veces, pero después de leerlas y hacer las correcciones sugeridas, todavía estoy perplejo.

La estructura de mi proyecto es la siguiente:

Project | src | root - has __init__.py | nested - has __init__.py | tests - has __init__.py | utilities - has __init__.py | services - has __init__.py 

He ejecutado con éxito una clase de regresión unittest de Eclipse sin ningún problema.

Tan pronto como intenté ejecutar la misma clase desde la línea de comandos (los otros usuarios que ejecutarán la suite no tendrán acceso a Eclipse) Recibo el error:

 ImportError: No module named 'root' 

Como puede ver desde arriba, la raíz del módulo tiene un __init__.py Todos los módulos __init__.py están completamente vacíos.

Y la ayuda sería recibida con gratitud.

Intente agregar un sys.path.append a la lista de sus importaciones.

 import sys sys.path.append("/Project/src/") import root import root.nested.tests 

Solo una nota para cualquier persona que llegue a este problema, utilizando lo que Gus E mostró en la respuesta de aceptación y alguna experiencia adicional, encontré que lo siguiente es muy útil para asegurar que pueda ejecutar mis progtwigs desde la línea de comandos en mi máquina. o en otro colega si fuera necesario.

 import sys import os sys.path.append(os.path.join(os.path.dirname(__file__), "..", "..")) 

Cuando ejecuto el método ‘principal’, que se encuentra en el directorio ‘nested’, se asegura de que el directorio ‘src’ se agregue a PYTHONPATH en el momento de la ejecución, lo que significa que todas las importaciones siguientes no generarán un error.

Obviamente, debe ajustar el número de argumentos “..” al método os.path.join() según lo determine la ubicación en su progtwig de donde se ejecuta su método principal

Si alguien aterriza aquí:

Me encontré con este error también. En mi caso, utilicé ~/my/path/ en la path.sys.append(...) , y la solución fue reemplazando ~ con el nombre de ruta explícito (puede consultarlo si escribe pwd cuando está en Linux shell, o use os.path.expanduser(..) )