falla la importación cuando se ejecuta python como script, pero no en iPython?

Tengo un proyecto estructurado como tal:

folder1 | folder2 | tests 

Tengo __init__.py en cada carpeta. Cuando estoy en el directorio principal de la carpeta 1, ejecuto iPython y hago

 from folder1.folder2.tests.test1 import main main() 

todo funciona bien Sin embargo cuando corro

 python folder1/folder2/tests/test1.py 

Obtengo ImportError: no hay un módulo llamado folder1.folder2.file1, donde mi statement de importación en test1 es

 from folder1.folder2.file1 import class1 

Confundido acerca de esto: supongo que es un problema de ruta pero no entiendo qué es lo que está mal con mi código (muchas configuraciones similares en otras carpetas) y por qué aún funciona en iPython y no Python se ejecuta como un script.

La ruta de búsqueda del módulo ( Python 3 docu ) es diferente con y sin un archivo de script:

intérprete interactivo de python

(va tanto para python como para ipython )

 $ python Python 2.7.3 (default, Dec 18 2014, 19:10:20) [GCC 4.6.3] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print(sys.path) ['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] >>> 

Tenga en cuenta que la primera entrada es una cadena vacía. Una cadena vacía es una ruta relativa equivalente a . . Las rutas relativas en la ruta de búsqueda del módulo son relativas al directorio de trabajo actual del proceso del intérprete, por lo que este es solo el directorio de trabajo actual donde se invocó al intérprete. (Que en tu caso resultó ser la raíz de tu proyecto).

ejecutando un archivo de script

 $ echo 'import sys' > /tmp/pathtest.py $ echo 'print(sys.path)' >> /tmp/pathtest.py $ python /tmp/pathtest.py ['/tmp', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7/gtk-2.0', '/usr/lib/python2.7/dist-packages/gst-0.10', '/usr/lib/python2.7/dist-packages/gtk-2.0', '/usr/lib/pymodules/python2.7', '/usr/lib/python2.7/dist-packages/ubuntu-sso-client', '/usr/lib/python2.7/dist-packages/ubuntuone-client', '/usr/lib/python2.7/dist-packages/ubuntuone-control-panel', '/usr/lib/python2.7/dist-packages/ubuntuone-couch', '/usr/lib/python2.7/dist-packages/ubuntuone-installer', '/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol'] 

Tenga en cuenta que aquí, la primera entrada es la ruta absoluta del directorio que contiene el archivo de script que pasamos como argumento.

Me enfrenté a un problema similar al importar numpy o cualquier biblioteca dependiendo de numpy. El problema fue que tenía un nombre de archivo random.py en la carpeta de mi proyecto.

Numpy tiene random.py en él para sus funciones aleatorias, pero importarlo estaba tomando el random.py de la carpeta de mi proyecto.

La mejor solución es no nombrar ningún archivo con los nombres de los módulos estándar de ninguna biblioteca.

Disfrutar .. 🙂