2011-04-14 6 views
6

Estoy intentando crear un paquete de instalación para un proyecto de Python con pruebas de unidad incluidas. Mi diseño del proyecto es el siguiente:ImportError en el subpaquete al ejecutar la prueba setup.py

setup.py 
src/ 
    disttest/ 
     __init__.py 
     core.py 
tests/ 
    disttest/ 
     __init__.py 
     testcore.py 

Mi setup.py se parece a esto:

from distutils.core import setup 
import setuptools 

setup(name='disttest', 
     version='0.1', 
     package_dir={'': 'src'}, 
     packages=setuptools.find_packages('src'), 
     test_suite='nose.collector', 
     tests_require=['Nose'], 
    ) 

El archivo contiene la línea tests/disttest/testcore.pyfrom disttest.core import DistTestCore.

Corriendo setup.py test ahora da un ImportError: No module named core.

Después de setup.py install, python -c "from disttest.core import DistTestCore" funciona bien. También funciona si pongo import core en src/disttest/__init__.py, pero realmente no quiero mantener eso y solo parece necesario para las pruebas.

¿Por qué es eso? ¿Y cuál es la forma correcta de solucionarlo?

+1

Me pregunto: ¿es tal vez una práctica común hacer 'setup.py install' antes de' setup.py test'? La [documentación de setuptools] (http://peak.telecommunity.com/DevCenter/setuptools#test) parece que este no es el caso, mis fuentes deben colocarse en 'sys.path' automáticamente. Tal vez 'nose.collector' no está al tanto de mi directorio base' package_dir'? –

+0

¿Cómo está importando core en testcore.py? ¿Qué es exactamente en su sys.path/PYTHONPATH? – Almad

Respuesta

1

Es posible que desee volver a verificar esto, pero parece que las pruebas están importando el paquete disttest en el directorio tests/, en lugar del paquete en pruebas desde el directorio src/.

¿Por qué necesita usar un paquete con el mismo nombre que el paquete bajo prueba? Simplemente movería el módulo de prueba al directorio de pruebas o cambiaría el nombre al paquete tests/disttest y evitaría el posible conflicto de nomenclatura.

En cualquier caso, que desea insertar una línea import pdb; pdb.set_trace() justo antes de la importación falla y jugar con diferentes declaraciones de importación para ver lo que está siendo importada desde donde (import sys; sys.modules['modulename'].__file__ es su amigo) para que tenga una mejor comprensión de lo que es yendo mal.

+0

Creo que su suposición es absolutamente correcta. La forma en que 'setup.py test' lanza mis pruebas, probablemente pone' tests/disttest/'delante de' src/disttest/'en' sys.path' y Python nunca 'combina' paquetes con el mismo nombre. Simplemente cambiar el nombre de 'tests/disttest /' a 'tests/disttest2' (solo para fines de prueba, obviamente) soluciona el problema. Tendré que comprobar cómo otros proyectos hacen esto y cuáles son las mejores prácticas aquí, ya que tener todos los módulos de prueba en el mismo directorio no es una opción para grandes proyectos, por supuesto. Gracias por los consejos de depuración! –

+0

No entiendo por qué 'src/disttest/__ init __. Py' se ejecuta antes de' tests/disttest/__ init __. Py'. (Lo confirmé añadiéndoles instrucciones de impresión.) Hubiera esperado que fuera al revés (o posiblemente 'src/disttest/__ init __. Py' no se ejecutara en absoluto, porque todas las importaciones solo importan' tests/disttest/'), pero eso fue solo por curiosidad y ahora puedo resolver mi problema. –

Cuestiones relacionadas