2012-07-13 8 views
5

Estoy experimentando con python, principalmente solucionando el código de otras personas. Estoy tratando de ejecutar un programa, "path\folderA\program.py".Falló la importación de Python desde otra carpeta

Estoy funcionando el programa de path\folderA

estoy consiguiendo un error:

ImportError: No module named fff.ggg.ppp 

program.py contiene una importación:

from fff.ggg.ppp import mmm 

En la carpeta "ruta \ FolderB" existen: "path\folderB\fff\__init__.py" "path\folderB\fff\ggg"

carpeta ggg también contiene __init__.py, así como el programa ppp.py

de la lectura de otros mensajes, como Python error "ImportError: No module named" entiendo que teniendo la __init__.py hace una carpeta de un "paquete", que hace que las importaciones de ella posible - pero que doesn' t trabajo, ya que estoy recibiendo un error.

Esto ha estado trabajando para otras personas que trabajaron con estos proyectos, así que hay algo mal con mi configuración.

He leído algo sobre los directorios que tienen que estar en sys.path. ¿Eso significa que tengo que agregarlos a la ruta de la variable de entorno? Eso significaría agregar una gran cantidad de directorios a la ruta, por lo que no puede ser.

Así que también encontró lo siguiente:

import sys 
sys.path.append(<path to FolderB>) 

Pero eso significa cambiar el código (que no ha sido necesario por otras personas) y la codificación dura un camino a lo que es en mi máquina local - la cual No debería tener que hacerlo, ¿verdad?

No puedo visualizarlo, aparentemente no se supone que deba cambiar el código y codificar la ruta física al módulo de importación. Entonces, ¿cómo puede un programa de la carpetaA incluso saber buscar en la carpeta B una importación?

¿Cómo funciona la magia de __init__.py trabajo?

+1

Python busca en la variable de entorno 'PYTHONPATH', no' PATH' – mgilson

Respuesta

1

I can't visualize it - apparently I am not supposed to change the code and hard-code the physical path to the import module - so how can a program from folderA even know to look in folderB for an import ?

Usted está correcto. De alguna manera tienes que decirle a python que busque módulos importados en la carpeta B. No existe la magia __init__.py que le permite importar desde otras carpetas en su disco duro.

Por lo general, si usted tiene varios paquetes de diferentes pitón de esa manera, trabajan por estar instalado en la biblioteca de Python. De esa forma pueden importar desde cualquier lugar. Esto generalmente se realiza mediante un script setup.py. Compruebe si folderB tiene uno.Ejecútelo con python setup.py install.

Si eso no funciona, necesitaremos más información sobre cómo se estructura este código.

+0

Gracias, he visto el archivo setup.py pero no sé cómo usarlo. Funcionó ! – Thalia

0

carpeta B debe estar en la sys.path, por lo que sería ya sea que tenga que mover mmm a A, o modificar sys.path desde dentro de una (no estoy seguro si funciona). __init__.py le dice a Python que la carpeta es un paquete, lo que podría tener carpetas con __init__.py dentro de carpetas con __init__.py y Python trata las carpetas dentro como partes de la carpeta principal. Echa un vistazo a Sympy o a casi cualquier gran biblioteca de Python y encontrarás esa estructura. También puede contener código para ejecutarse en la importación, pero también puede estar vacío.

Cuestiones relacionadas