对于某些功能测试,我使用 Python 的 subprocess.call
(或调用后者的 check_call
)直接从项目目录调用几个实用程序。当全局安装库(特别是 PyYAML)时,这很有效。在 virtualenv 中运行,例如在 Travis-CI 下,会导致问题,尤其是当 virtualenv 运行 Python 3.x 并且全局 Python 为 2.7 时。
如果两个 Python 都是 2.7,为了不导致一个导入错误。但是,当 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 路径的混合,后者如上所述被明确注入(inject)。
virtualenv
或 subprocess
函数中是否有某种方法可以确保子进程在 virtualenv“内部”运行?
最佳答案
如果传入环境变量的副本并使用当前 Python 解释器作为子进程的目标,则应保留 virtualenv 环境。像这样:
subprocess.call([sys.executable, 'yourscript.py'], env=os.environ.copy())
关于python - 混合 Python 2.7/3.3 环境中的 virtualenv 和 subprocess.call(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430609/