SO には、次のような多くの投稿があります。subprocess.Popen 呼び出しの出力を文字列に格納します。
複雑なコマンドに問題があります。たとえば、これから出力を取得する必要がある場合
ps -ef|grep something|wc -l
サブプロセスの引数は[プログラム名、引数]であるため、サブプロセスは仕事をしません。そのため、より洗練されたコマンド(より多くのプログラム、パイプなど)を使用することはできません。
複数のコマンドのチェーンの出力をキャプチャする方法はありますか?
SO には、次のような多くの投稿があります。subprocess.Popen 呼び出しの出力を文字列に格納します。
複雑なコマンドに問題があります。たとえば、これから出力を取得する必要がある場合
ps -ef|grep something|wc -l
サブプロセスの引数は[プログラム名、引数]であるため、サブプロセスは仕事をしません。そのため、より洗練されたコマンド(より多くのプログラム、パイプなど)を使用することはできません。
複数のコマンドのチェーンの出力をキャプチャする方法はありますか?
shell=Trueサブプロセスにオプションを渡すだけです
import subprocess
subprocess.check_output('ps -ef | grep something | wc -l', shell=True)
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 によって提案されたシェル委任アプローチを代わりに使用することを好みます。これは一般的で、非常に読みやすく、便利です。
別の方法として、コマンドの一部を単純な 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