對於一些功能測試,我直接調用幾個實用程序從項目目錄,使用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路徑的混合物,後者被明確地注入如上所述。
有沒有辦法從virtualenv
或subprocess
函數中確保子進程在virtualenv內「運行」?
你能告訴我們你的subprocess.call代碼嗎? – jterrace 2013-05-08 00:29:28
您可以在''DbMigrateTestCase.create_yaml''(例如)查找代碼[這裏](https://github.com/jmafc/Pyrseas/blob/master/pyrseas/testutils.py)。 – 2013-05-08 00:53:34