【问题标题】:Running three commands in the same process with Python使用 Python 在同一进程中运行三个命令
【发布时间】:2011-07-02 12:27:28
【问题描述】:

我需要在 Win32 上运行这三个命令来进行分析/代码覆盖率报告。

vsperfcmd /start:coverage /output:run.coverage
helloclass
vsperfcmd /shutdown

我不能一个一个地运行一个命令,因为 helloclass 可执行文件应该在 vsperfcmd 的同一进程中进行分析。

我想到的是制作一个批处理文件来运行这三个命令,并在 Python 中运行该批处理文件。但是,我认为 python 应该有一种方法来执行启动 shell 和运行命令的等效操作。

  • 问:如何在 Python 中运行同一进程中的命令?
  • 问:或者,如何在 Python 中启动命令 shell 并运行命令?

已解决

import subprocess
cmdline = ["cmd", "/q", "/k", "echo off"]
cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
batch = b"""\
rem vsinstr -coverage helloclass.exe /exclude:std::*
vsperfcmd /start:coverage /output:run.coverage
helloclass
vsperfcmd /shutdown
exit
"""
cmd.stdin.write(batch)
cmd.stdin.flush() # Must include this to ensure data is passed to child process
result = cmd.stdout.read()
print(result)

【问题讨论】:

标签: python process launch


【解决方案1】:

有趣的问题。

一种可行的方法是运行命令 shell,然后通过stdin 将命令传送给它(示例使用 Python 3,对于 Python 2,您可以跳过 decode() 调用)。请注意,命令 shell 调用设置为禁止所有内容,除了写入标准输出的显式输出。

>>> import subprocess
>>> cmdline = ["cmd", "/q", "/k", "echo off"]
>>> cmd = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> batch = b"""\
... set TEST_VAR=Hello World
... set TEST_VAR
... echo %TEST_VAR%
... exit
... """
>>> cmd.stdin.write(batch)
59
>>> cmd.stdin.flush() # Must include this to ensure data is passed to child process
>>> result = cmd.stdout.read()
>>> print(result.decode())
TEST_VAR=Hello World
Hello World

将其与单独调用 subprocess.call 的结果进行比较:

>>> subprocess.call(["set", "TEST_VAR=Hello World"], shell=True)
0
>>> subprocess.call(["set", "TEST_VAR"], shell=True)
Environment variable TEST_VAR not defined
1
>>> subprocess.call(["echo", "%TEST_VAR%"], shell=True)
%TEST_VAR%
0

后两个调用看不到第一个调用设置的环境,因为所有 3 个都是不同的子进程。

【讨论】:

    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多