3

Win32 でプロファイリング/コード カバレッジ レポートを作成するには、これら 3 つのコマンドを実行する必要があります。

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

helloclass 実行可能ファイルは vsperfcmd の同じプロセスでプロファイリングする必要があるため、コマンドを 1 つずつ実行することはできません。

私が考えているのは、これら 3 つのコマンドを実行するバッチ ファイルを作成し、そのバッチ ファイルを 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)
4

2 に答える 2

7

興味深い質問です。

機能する 1 つのアプローチは、コマンド シェルを実行し、コマンドをパイプすること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

後の 2 つの呼び出しは、最初の呼び出しによって設定された環境を参照できません。3 つすべてが別個の子プロセスであるためです。

于 2011-02-23T06:23:32.667 に答える
2

Python で外部コマンドを呼び出す

Python から外部コマンドを非同期で実行するにはどうすればよいですか?

http://docs.python.org/library/subprocess.html

特に、「subprocess」モジュールをチェックアウトし、「shell」パラメータを検索してください。

于 2011-02-23T05:23:29.933 に答える