2011-11-04 12 views
7

He revisado tantas páginas SO como pude y he intentado todo lo que encontré, pero ninguna ha sido exitosa. También revisé la página PEP con respecto a la importación y probé cada ejemplo, ninguno de los cuales funcionó.¿Cómo importar un módulo desde una carpeta al lado de la carpeta actual?

Tengo una carpeta de pruebas con pruebas de unidad en ellas, y necesito importar el módulo que deseo probar. Los módulos están en una carpeta llamada 'src' que está al lado de la carpeta src.

Las carpetas/archivos tienen el siguiente aspecto:

Project/
     src/
      stringbuilder.py 
      __init__.py 
     tests/
      stringbuilder_test.py 
      __init__.py 
     main.py 
     __init__.py 

He intentado todo lo que pude: la adición de __init__.py a cada carpeta por lo que es un módulo que incluye la carpeta principal del proyecto.

import src.module_to_test 
from ..src.module_to_test import function_to_test 
from ..src import module_to_test 

He probado todas las demás combinaciones, todas las cuales han fallado. Estoy empezando a pensar que debe haber algún problema con mi configuración o mi comprensión. Pensé que se suponía que era simple.

Si cometo algún error obvio por favor hágamelo saber.

from tests import stringbuilder 

mensaje de error:

$ ./stringbuilder_test.py 
Traceback (most recent call last): 
    File "./stringbuilder_test.py", line 14, in <module> 
    from tests import stringbuilder 
ImportError: No module named tests 

Se produce el mismo error de (pero las pruebas = src):

from src import stringbuilder 
+0

"src" o "tests"? ¿Puede darnos más detalles sobre la jerarquía de archivos y carpetas? – Nicolas

+0

Se agregó un poco en la publicación para intentar mostrar la jerarquía. –

+0

'from tests import stringbuilder' - solo tiene que mirar la estructura de árbol de arriba para ver por qué eso falla –

Respuesta

3

Si los scripts se ejecutan desde dentro de un paquete, entonces se deben emplear varios hacks para que las importaciones funcionen correctamente. Probablemente la más común de ellas es para manipular sys.path:

import sys, os 

sys.path.insert(0, 
    os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) 

from src import stringbuilder 

del sys.path[0] 

No hay manera de lograr esto usando declaraciones de importación normales.

Una solución generalmente mejor es simplemente evitar ejecutar secuencias de comandos dentro de los paquetes por completo. En su lugar, ponga todos los scripts fuera del el paquete en un directorio contenedor. Dado que el directorio del script actualmente en ejecución se agrega automáticamente al inicio de sys.path, esto garantizará que el paquete siempre se pueda importar directamente, sin importar desde dónde se ejecuta el script.

Así que la estructura de directorios podría ser algo como esto:

project/
    package/
     __init__.py 
     src/
      __init__.py 
      stringbuilder.py 
     tests/
      __init__.py 
      stringbuilder_test.py 
    main.py 
    test.py 

El guión test.py continuación, puede importar sus pruebas como esto:

from package.tests import stringbuilder_test 

Y stringbuilder_test.py puede importar los módulos src así:

from package.src import stringbuilder 
-3

Añadir esa carpeta en el PATH.

+2

¡Ay! Que espantosa idea –

+0

Agregarlo a PYTHONPATH es un poco menos terrible pero no tiene sentido. Agregar a PATH no ayudará en lo más mínimo. – geoffspear

0
from folder import my_module 

Si hay un archivo __init__.py en folder.

+0

Esto falló, dijo que no hay un módulo llamado carpeta. –

+0

Er, creo que estabas destinado a reemplazar 'folder' con el nombre de tu carpeta! –

+0

Lo intenté, el mismo error. :( –

Cuestiones relacionadas