2013-05-08 5 views
9

일부 기능 테스트의 경우 Python의 subprocess.call (또는 후자를 호출하는 check_call)을 사용하여 프로젝트 디렉토리에서 직접 몇 가지 유틸리티를 호출합니다. 이것은 라이브러리 (특히 PyYAML)가 전역 적으로 설치 될 때 잘 작동합니다. Travis-CI와 같은 virtualenv에서 실행하면 문제가 발생합니다. 특히 virtualenv에서 Python 3.x가 실행되고 Python이 2.7이면 문제가 발생합니다.mixed Python 2.7/3.3 환경에서 virtualenv 및 subprocess.call()

둘 다 Pythons가 2.7 인 경우, 에 env 인수를 사용하여 virtualenv 내에 PyYAML의 위치를 ​​주입해야합니다. 그러면 ImportError가 발생하지 않습니다. 그러나 virtualenv가 3.x 인 경우에는 작동하지 않습니다. 그것은 그것의 sys.path 다음과 같이 보이는 때문에 VIRTUALENV 외부 호출 된 유틸리티가 실행을 나타납니다

'/home/travis/build/jmafc/Pyrseas/pyrseas', '/usr/local/lib/python2.7/dist-packages/distribute-0.6.35-py2.7.egg', '/usr/local/lib/python2.7/dist-packages/pip-1.3.1-py2.7.egg', '/home/travis/build/jmafc/Pyrseas', '/home/travis/virtualenv/python3.3/lib/python3.3/site-packages', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info', '/usr/lib/python2.7/dist-packages'] 

공지 2.7 및 3.3 경로의 혼합물, 후자는 명시 적으로 위에서 언급 한 바와 같이 주입된다.

virtualenv 또는 subprocess 함수에서 하위 프로세스가 virtualenv 내부에서 실행되는지 확인하는 방법이 있습니까?

+0

subprocess.call에 대한 코드를 표시 할 수 있습니까? – jterrace

+0

"DbMigrateTestCase.create_yaml"(예 :)에서 [here] (https://github.com/jmafc/Pyrseas/blob/master/pyrseas/testutils.py) 코드를 찾을 수 있습니다. –

답변

19

환경 변수 사본을 전달하고 현재 파이썬 인터프리터를 하위 프로세스의 대상으로 사용하는 경우 virtualenv 환경이 보존되어야합니다. 이 같은 것 :

subprocess.call([sys.executable, 'yourscript.py'], env=os.environ.copy()) 
+0

고마워, 그게 내 virtualenv에서 트릭을 할 것으로 보인다. 이제 Travis-CI에서 어떻게 사용되는지 알아 보겠습니다. –