4

SO には、次のような多くの投稿があります。subprocess.Popen 呼び出しの出力を文字列に格納します。

複雑なコマンドに問題があります。たとえば、これから出力を取得する必要がある場合

ps -ef|grep something|wc -l

サブプロセスの引数は[プログラム名、引数]であるため、サブプロセスは仕事をしません。そのため、より洗練されたコマンド(より多くのプログラム、パイプなど)を使用することはできません。

複数のコマンドのチェーンの出力をキャプチャする方法はありますか?

4

3 に答える 3

5

shell=Trueサブプロセスにオプションを渡すだけです

import subprocess
subprocess.check_output('ps -ef | grep something | wc -l', shell=True)
于 2013-02-20T02:42:26.703 に答える
5

subprocess モジュールを使用したシェルのないクリーン バージョンの場合は、次の例を使用できます (ドキュメントから)。

output = `dmesg | grep hda`

になる

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

Python プログラムは、ここで基本的にシェルが行うことを行います。つまり、各コマンドの出力を次のコマンドに順番に送信します。このアプローチの利点は、プログラマーがコマンドの個々の標準エラー出力を完全に制御できることです (必要に応じて抑制したり、ログに記録したりできます)。

subprocess.check_output('ps -ef | grep something | wc -l', shell=True)そうは言っても、私は一般的に nneonneo によって提案されたシェル委任アプローチを代わりに使用することを好みます。これは一般的で、非常に読みやすく、便利です。

于 2013-02-20T02:43:59.470 に答える
3

別の方法として、コマンドの一部を単純な Python で実装することもできます。例えば、

count = 0
for line in subprocess.check_output(['ps', '-ef']).split('\n'):
    if something in line: # or re.search(something, line) to use regex
        count += 1
print count
于 2013-02-20T02:39:45.293 に答える