2012-07-12 13 views
7

He buscado este sitio de arriba a abajo pero no he encontrado una sola manera de lograr realmente lo que quiero en Python3x. Esta es una aplicación de juguete simple, así que pensé que podría escribir algunos casos de prueba simples en afirmaciones y llamarlo un día. Genera informes, por lo que me gustaría asegurarme de que mi código no haga ningún cambio en los cambios.Importar directorio principal para pruebas breves

Mi estructura de directorio actual es: (sólo partes relevantes incluidos)

project 
    -model 
    __init__.py 
    my_file.py 
    -test 
     my_file_test.py 

estoy teniendo un montón de tiempo conseguir my_file_test.py importar my_file.py.

Como he dicho. He buscado este sitio de arriba a abajo y ninguna solución ha funcionado. Mi versión de Python 3.2.3 es que se ejecuta en Fedora 17.

intentos previamente probado: https://stackoverflow.com/questions/5078590/dynamic-imports-relative-imports-in-python-3 Importing modules from parent folder Can anyone explain python's relative imports? How to accomplish relative import in python

En prácticamente todos los intentos consigo un error al efecto de:

ImportError: Ningún módulo llamado * O ValueError: Intento de importación relativa en el paquete

¿Qué está pasando aquí? He intentado todas las respuestas aceptadas en SO, así como en todos los interwebs. No estoy haciendo nada que me guste, pero como programador de .NET/Java/Ruby, esta es la definición absoluta de intuición.

EDIT: Si importa traté de cargar la clase que estoy tratando de importar en el REPL y me sale el siguiente:

>>> import datafileclass 
>>> datafileclass.methods 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
>>> x = datafileclass('sample_data/sample_input.csv') 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: 'module' object is not callable 

si importa ... Yo sé la funcionalidad en los trabajos de clase pero no puedo importarlo, lo que en el presente está causando la incapacidad de probar. En el futuro seguramente causará problemas de integración. (nombres cambiados para proteger a los inocentes) obteniendo un par de semanas de la funcionalidad deseada para esta iteración de la biblioteca ... cualquier ayuda podría ser útil. Lo habría hecho en Ruby, pero el cliente quiere que el Python como una experiencia de aprendizaje,

Respuesta

6

Estructura de su código como este:

project 
    -model 
    __init__.py 
    my_file.py 
    -tests 
    __init__.py 
    test_my_file.py 

Es importante destacar que el directorio de tests también debe ser un directorio de módulos (tiene un vacío __init__.py archivo en ella).

Luego en test_my_file.py use from model import my_file, y desde el directorio superior ejecute python -m tests.test_my_file. Esto está invocando test_my_file como un módulo, lo que hace que Python configure su ruta de importación para incluir su nivel superior.

Aún mejor, puede usar pytest o nose, y ejecutar py.test recogerá las pruebas automáticamente.

Me doy cuenta de que esto no responde a su pregunta, pero le resultará mucho más fácil trabajar con las prácticas estándar de Python en lugar de contra ellas. Eso significa estructurar su proyecto con pruebas en su propio directorio de nivel superior.

+0

Gracias. Lo intentaré esta noche.Eso fue similar a mi estructura original, pero me encontré con algún recurso que decía que debería estructurarlo de esta manera. Te dejaré saber cómo funciona una vez que esté sin trabajo. – Rig

+1

Esto provoca un error "ImportError: No module named model" en la línea 1 (la instrucción de importación). ¿Qué pasa con esta imagen? – Rig

+0

¿Hay algún tipo de anotaciones explícitas que necesito en mi clase para que sea importable? No soy muy versado en python y ha pasado un tiempo desde que lo utilicé (que entonces solo tenía capacidad de enseñanza). – Rig

Cuestiones relacionadas