10

对于一些功能测试,我直接从项目目录中调用几个实用程序,使用 Python subprocess.call(或check_call调用后者)。这在全局安装库(尤其是 PyYAML)时效果很好。在 virtualenv 中运行,例如在 Travis-CI 下,会导致问题,尤其是在 virtualenv 运行 Python 3.x 并且全局 Python 为 2.7 时。

env如果两个 Python 都是 2.7,我仍然必须使用to 的参数在 virtualenv 中注入 PyYAML 的位置,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“内”运行?

4

1 回答 1

20

如果您传入环境变量的副本并使用当前 Python 解释器作为子进程的目标,则应保留 virtualenv 环境。像这样的东西:

subprocess.call([sys.executable, 'yourscript.py'], env=os.environ.copy())
于 2013-05-08T00:32:36.660 回答