2013-05-08 81 views
9

對於一些功能測試,我直接調用幾個實用程序從項目目錄,使用Python的subprocess.call(或check_call它調用後者)。當圖書館(特別是PyYAML)全球安裝時,這很有效。運行在virtualenv上,比如在Travis-CI下運行會導致問題,特別是如果virtualenv運行的是Python 3.x,而全局Python是2.7。的virtualenv和subprocess.call()中混合的Python 2.7/3.3環境

如果兩個Pythons都是2.7,我仍然必須在virtualenv中注入PyYAML的位置,使用env參數到subprocess.call,以避免導致ImportError。但是,當virtualenv是3.x時,這不起作用。它出現在的virtualenv外部調用實用程序運行,因爲它的sys.path看起來如下:

'/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路徑的混合物,後者被明確地注入如上所述。

有沒有辦法從virtualenvsubprocess函數中確保子進程在virtualenv內「運行」?

+0

你能告訴我們你的subprocess.call代碼嗎? – jterrace 2013-05-08 00:29:28

+0

您可以在''DbMigrateTestCase.create_yaml''(例如)查找代碼[這裏](https://github.com/jmafc/Pyrseas/blob/master/pyrseas/testutils.py)。 – 2013-05-08 00:53:34

回答

19

如果你在你的環境變量的副本傳遞和使用當前Python解釋器作爲子進程的目標,在virtualenv中環境應予以保留。這樣的事情:

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

謝謝,這似乎是在我的virtualenv伎倆。現在我要看看它在Travis-CI中的表現。 – 2013-05-08 00:57:34