python - 混合 Python 2.7/3.3 环境中的 virtualenv 和 subprocess.call()

标签 python subprocess virtualenv travis-ci

对于某些功能测试,我使用 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)。

virtualenvsubprocess 函数中是否有某种方法可以确保子进程在 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/

相关文章:

python - MultiValueDictKeyError 在/addbook/

python - 在python中使用Sed通过subprocess.call进行文件替换

python - python子进程中的子shell

python - 无法运行keras

python - 如何使用 `crontab` 或 `gnome-terminal` 从虚拟环境执行命令

Python + Django + Virtualenv 导入 django.core 失败

python - joblib并行计算时间

python - 为什么这个 Regexp 使用 pcre 而不是 Python 的步骤减少了 99.89%?

javascript - 从 Pyramid View 的 subprocess.Popen 动态输出 stdout 到网页

python - 在pygame中渲染unicode