使用python在不同的virtualenv中运行子进程

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (144)

假设我在2种不同的虚拟环境中安装了2个不同版本的应用程序。myapp v1.0和myapp v2.0。

现在我想比较一下。比较是用python本身编写的。最好的方法是什么?我们假设我可以单独运行它们并且都写一个输出文件,我可以稍后比较。

一种方法是编写一个bash脚本(这就是我目前所拥有的)。我激活一个virtualenv,运行myapp v1.0,激活另一个virtualenv,运行myapp v2.0。稍后在这些文件上运行比较模块。但是我想在那里添加更多的动态(采用一些可选的参数等),使用python会更容易。

编辑:

目前我有类似的东西(一个bash脚本):

source virtualenv1/bin/activate
python my_script.py
deactivate

source virtualenv2/bin/activate
python my_other_script.py
deactivate

python my_comparison_script.py

相反,我只想这样做:

python my_comparison_script.py

我的脚本将在此内部运行。

提问于
用户回答回答于

究竟是什么问题?如何使用子进程执行shell命令?如果是这种情况,一些简单的伪代码可能看起来像:

import subprocess

myProcess = subprocess.Popen(   ['these', 'are', 'for', 'the', 'shell'],
                                stdout=subprocess.PIPE,
                                stderr=subprocess.PIPE )

[outStream, errStream] = myProcess.communicate()

那么你可以用标准的out(outStream)做任何你喜欢的事情,并且如果errStream存在则做不同的事情(标准错误)。这包括将标准输出或标准错误写入文件。然后我猜你会分散那些文件?

一个实际的代码示例(假设您在Linux系统上有python 2.6+)可能如下所示:

import subprocess

with open('dateHelp.log', 'w') as dateLog:
    with open('dateHelp.err', 'w') as errLog:
        dateHelp = subprocess.Popen([ 'date', '-h'], stdout=dateLog, 
                                                     stderr=errLog)
        dateHelp.communicate()
用户回答回答于

接受的答案没有解决在子流程中“激活”virtualenv的问题。

如果你通过调用python可执行文件启动你的应用程序,就像在你的例子中一样,它实际上非常简单:你只需要明确指向virtualenv中的可执行文件。

import subprocess

subprocess.Popen(["virtualenv1/bin/python", "my_script.py"])
subprocess.Popen(["virtualenv2/bin/python", "my_other_script.py"])

将在相应的virtualenvs中启动流程。

重要

为解决评论中提出的问题:

如果要运行子进程并确保使用当前进程运行相同的解释器,则必须使用sys.executable。也可用:sys.exec_prefix用于访问特定于站点的目录前缀,其中安装了与平台相关的Python文件。

如果您想对此主题进行更深入的讨论,请查看此拉取请求

所属标签

可能回答问题的人

  • 西风

    renzha.net · 站长 (已认证)

    7 粉丝1 提问9 回答
  • 四无君

    0 粉丝0 提问3 回答
  • 旺仔小小鹿

    社区 · 运营 (已认证)

    46 粉丝0 提问2 回答
  • 拉布拉多拉不多

    1 粉丝0 提问2 回答

扫码关注云+社区

领取腾讯云代金券