2011-04-14 2 views
6

유닛 테스트가 포함 된 Python 프로젝트의 설치 패키지를 만들려고합니다. 다음과 같이 내 프로젝트 레이아웃은 다음과 같습니다 setup.py 테스트를 실행할 때 하위 패키지에 ImportError가 발생했습니다.

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

setup.py

은 다음과 같습니다

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'], 
    ) 

파일 tests/disttest/testcore.py 라인 from disttest.core import DistTestCore가 포함되어 있습니다.

setup.py test을 실행하면 ImportError: No module named core가됩니다.

setup.py install 이후에 python -c "from disttest.core import DistTestCore"이 정상적으로 작동합니다. 그것은 import coresrc/disttest/__init__.py에 넣어도 작동하지만, 실제로는 유지하고 싶지 않고 테스트에만 필요합니다.

왜 그럴까요? 그리고 그것을 수정하는 올바른 방법은 무엇입니까?

+1

나는'setup.py test' 전에'setup.py install'을 하는게 일반적인 관행인가요? [setuptools documentation] (http://peak.telecommunity.com/DevCenter/setuptools#test)이 그렇지 않은 것처럼 들리지만, 내 소스는 자동으로'sys.path'에 있어야합니다. 아마'nose.collector'는 내'package_dir'베이스 디렉토리를 알지 못했을까요? –

+0

testcore.py에서 core를 어떻게 가져 오나요? sys.path/PYTHONPATH에 정확히 무엇이 있습니까? – Almad

답변

1

012-디렉토리의 package-under-test 대신 디렉토리에서 패키지가 disttest 디렉토리로 가져 오기중인 것처럼 보입니다.

왜 package-under-test와 같은 이름의 패키지를 사용해야합니까? testcore 모듈을 테스트 디렉토리로 옮기거나 tests/disttest 패키지의 이름을 바꾸고 잠재적 인 이름 충돌을 피할 수 있습니다. 어떤 경우

, 당신은 바로 실패 오기 전에 import pdb; pdb.set_trace() 라인을 삽입하고 ( import sys; sys.modules['modulename'].__file__이 당신의 친구입니다) 곳에서 가져 오는 상황을 확인하기 위해 다른 import 문 주변에 놀고 싶어 그래서 당신은 무엇에 더 나은 통찰력을 얻을 잘못되어가는.

+0

당신의 가정은 절대적으로 정확하다고 생각합니다. 'setup.py test'가 테스트를 시작하는 방식으로,'sys/path '의'src/disttest /'앞에'tests/disttest /'를 넣을 것이고 파이썬은 같은 이름의 패키지를 절대 "병합"하지 않을 것입니다. 'tests/disttest /'를'tests/disttest2'로 바꾸면 (테스트 목적으로 만, 분명히) 문제가 해결됩니다. 다른 프로젝트에서이 작업을 수행하는 방법과 모범 사례가 여기에 있는지 확인해야합니다. 같은 디렉토리에있는 모든 테스트 모듈을 거대한 프로젝트의 옵션으로 사용하지 않아도됩니다. 디버깅 팁 주셔서 감사합니다! –

+0

'src/disttest/__ init __. py'가'tests/disttest/__ init __. py'보다 먼저 실행되는 이유는 무엇입니까? (필자는 그것들에 print 문을 추가하는 것으로 확인했다.) 다른 방법으로 (또는 아마도'src/disttest/__ init __. py'는 전혀 실행되지 않을 것입니다.) 모든 import가'tests/disttest /'),하지만 그것은 단지 호기심에서 벗어나서 이제는 내 문제를 해결할 수 있습니다. –