使用Python在同一进程中运行三个命令

3 投票
2 回答
8738 浏览
提问于 2025-04-16 12:21

我需要在Win32上运行这三个命令,以进行性能分析和代码覆盖率报告。

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

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

我想的办法是制作一个批处理文件来运行这三个命令,然后在Python中运行这个批处理文件。不过,我觉得Python应该有办法做到类似于打开一个命令行并运行命令的操作。

  • 问:我怎么才能在Python中在同一个进程里运行这些命令呢?
  • 问:或者,我怎么能在Python中打开命令行并运行命令呢?

解决方案

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)

2 个回答

8

这个问题很有意思。

一种可行的方法是运行一个命令行,然后通过 stdin 将命令传递给它(这个例子使用的是 Python 3,如果你用的是 Python 2,可以省略 decode() 这一步)。需要注意的是,命令行的调用设置成只显示明确写入标准输出(stdout)的内容,其他的都不显示。

>>> 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

后面两个调用无法看到第一个调用设置的环境,因为这三个都是独立的子进程。

撰写回答