ImportError: no hay módulo nombrado cuando el módulo está allí

Normalmente ejecuto python2 pero estoy jugando con python3. En este momento estoy confundido en cuanto a por qué estoy recibiendo este error.

Cuando ejecuto el comando ./test_web_events.py en el directorio de tests , obtengo:

 Traceback (most recent call last): File "./test_web_events.py", line 21, in  import qe.util.scratchstore as scratchstore ImportError: No module named 'qe' 

Sin embargo mi estructura de proyecto tiene un directorio qe :

 /python_lib Makefile /qe __init__.py /tests __init__.py test_web_events.py /util __init__.py scratchstore.py /trinity __init__.py 

Intenté mover mi directorio /tests a /python_lib pero sigo recibiendo el mismo error:

 MTVL1289dd026:python_lib bli1$ ls Makefile qe rundata setup.sh tests MTVL1289dd026:python_lib bli1$ python3 tests/test_web_events.py Traceback (most recent call last): File "tests/test_web_events.py", line 21, in  import qe.util.scratchstore as scratchstore ImportError: No module named 'qe' 

Aquí está mi sys.path para python2

 >>> import sys >>> print sys.path ['', '/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages'] 

sys.path para python3

 >>> print(sys.path) ['', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python34.zip', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages'] 

El problema es que /python_lib no está en la ruta de Python. El comportamiento es el mismo en Python 2 y 3.

En general, no ejecute scripts desde (dentro) de un paquete de Python , ejecútelos desde el directorio de nivel superior en su lugar:

 /python_lib$ python -m qe.tests.test_web_events 

Así, /python_lib está en la ruta de acceso de Python y /python_lib/qe/tests no. Se supone que hay tests/__init__.py archivo.

No modifique sys.path manualmente. Puede llevar a errores sutiles relacionados con la importación de módulos. Hay mejores alternativas, por ejemplo, si no desea ejecutar los scripts desde /python_lib , simplemente instale la versión de desarrollo:

 (your_virtualenv)/python_lib$ pip install -e . 

Esto es muy probable porque no ha agregado /python_lib/qe a su PYTHONPATH .

Cuando intenta importar un módulo, el intérprete lo buscará solo en un cierto número de lugares, no puede intentar importar un módulo de manera arbitraria.

Las formas más comunes son tener un paquete instalado a través de pip , tener el módulo en el mismo directorio que el archivo .py o agregar la ruta a ese módulo en PYTHONPATH .

Consulte: https://docs.python.org/2/tutorial/modules.html#the-module-search-path

Parece que el último caso es lo más probable que quieras hacer. Esto dependerá de su sistema operativo, pero buscarlo en Google debería ser sencillo.

Asegúrese de tener el archivo __init__.py en todas sus carpetas de paquetes para que su estructura se vea como

 /python_lib Makefile /qe /tests test_web_events.py /util __init__.py <------------ create this file scratchstore.py /trinity __init__.py 

y luego el cd a la carpeta python_lib y ejecuta `` export PYTHONPATH = `pwd```

Simplemente #!/usr/bin/env python agregue esto a todos sus scripts. Asegúrate de que esté en la parte superior.

 #!/usr/bin/env python import qe 

Supongo que agregó Python 3 a la ruta , si lo hizo, el único problema es este. No necesitas init.py o sys.path ni nada. Esta línea ya encuentra la ruta de Python automáticamente si agregó Python 3 a la ruta, si Python 2 aún está en la ruta, entonces es normal que haya un error.