2011-09-28 18 views
58

que tiene una aplicación de pitón con la siguiente estructura de directorios:ImportError: Sin módulo denominado - Python

src 
| 
+---- main 
| 
+---- util 
| 
+---- gen_py 
     | 
     +---- lib 

En el paquete principal, tengo un módulo de Python llamado MyServer.py que tiene una importación declaración como:

from gen_py.lib import MyService 

a fin de que esta declaración a trabajar, puse la siguiente línea al principio de MyServer.py:

import sys 
sys.path.append('../gen_py/lib') 

Cuando corro MyServer.py en la terminal, me sale el siguiente error:

ImportError: No module named gen_py.lib

Lo que estoy perdiendo aquí?

+0

¿Cuál fue la línea de comandos que utilizó para ejecutar MyServer.py? ¿En qué directorio estabas? –

Respuesta

69

Su modificación de sys.path supone que el directorio de trabajo actual siempre está en main/. Este no es el caso. En su lugar, sólo tiene que añadir el directorio padre a sys.path:

import sys 
import os.path 

sys.path.append(os.path.join(os.path.dirname(__file__), '..')) 
import gen_py.lib 

No se olvide de incluir un archivo __init__.py en gen_py y lib - de lo contrario, no van a ser reconocidas como módulos de Python.

+0

Esto ha ayudado, gracias. –

+0

Tengo el mismo problema. Yo uso Windows, Eclipse. ¿Qué deberíamos hacer en Eclipse? – Ayse

+0

@Ceren Este código debería funcionar en todos los IDE. Su IDE (o más precisamente, el complemento de Python para ello) puede que no ejecute realmente el código de Python, en cuyo caso probablemente necesite configurar la ruta de búsqueda en algún lugar. Siéntase libre de [hacer una nueva pregunta] (http://stackoverflow.com/questions/ask) sobre eso. – phihag

6

Para que la importación del módulo Python funcione, debe tener "src" en su ruta, no "gen_py/lib".

Al procesar una importación como import gen_py.lib, busca un módulo gen_py, luego busca un submódulo lib.

Como el módulo gen_py no estará en "../gen_py/lib" (estará en ".."), la ruta que agregó no ayudará en nada al proceso de importación.

Dependiendo de dónde lo está ejecutando, intente agregar la ruta relativa a la carpeta "src". Tal vez es sys.path.append('..'). También puede ser que tenga éxito la ejecución del script, mientras que dentro de la carpeta src directamente, a través de las rutas relativas como python main/MyServer.py

+0

Intenté este sys.path.append ('../../ src/gen_py/lib') pero obtengo el mismo error ... –

+0

Eso no es lo que dije. No anexa gen_py/lib a la ruta si está importando "gen_py.lib". Agregas la carpeta gen_py está adentro, que en este caso es probablemente "..". – lunixbochs

5
from ..gen_py.lib import MyService 

o

from main.gen_py.lib import MyService 

Asegúrate de que tienes una (al menos vacío) __init__.py archivo en cada directorio .

3

Asegúrese de incluir __init__.py, lo que hace Python sabe que esos directorios containpackages

3

Esto es, si usted está construyendo un paquete y usted está encontrando errores en las importaciones. Lo aprendí de la manera más difícil. La respuesta es no agregar el paquete a la ruta de Python o hacerlo programáticamente (¿qué pasa si tu módulo se instala y tu comando lo vuelve a agregar?), Eso es una mala manera.

Lo correcto es: 1) Usar virtualenv pyvenv-3.4 o algo similar 2) Activar el modo de desarrollo - $ python setup.py desarrollar

Cuestiones relacionadas