Запуск трех команд в одном процессе с Python - PullRequest
3 голосов
/ 23 февраля 2011

Мне нужно запустить эти три команды для профилирования / создания отчетов о покрытии кода на Win32.

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

Я не могу запустить одну команду за одной, потому что исполняемый файл helloclass должен быть профилирован в одном и том же процессе vsperfcmd,

Я думаю о том, чтобы создать командный файл для запуска этих трех команд и запустить командный файл в Python.Тем не менее, я думаю, что Python должен иметь способ сделать эквивалентное действие запуска оболочки и запуска команд.

  • Q: Как я могу запустить команды в одном и том же процессе в Python?
  • Q: Или как я могу запустить командную оболочку и запустить команды в 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 ]

6 голосов
/ 23 февраля 2011

Интересный вопрос.

Один из подходов, который работает, - это запустить командную оболочку и затем передать ей команды через 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

Последние два вызова не могут видеть среду, настроенную первым, поскольку все 3 являются различными дочерними процессами.

1 голос
/ 23 февраля 2011
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...