web-dev-qa-db-ja.com

サブプロセス呼び出しをテキストファイルにパイプするにはどうすればよいですか?

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"])

現在、実行するスクリプトがあります。実行してこの行にヒットすると、run.shに印刷が含まれているため、印刷が開始されます。

これをテキストファイルにパイプするにはどうすればよいですか? (可能な場合は印刷も)

72
TIMEX

出力をファイルに書き込みたい場合は、subprocess.callの-​​ stdout -argumentを使用できます。

Nonesubprocess.PIPE、ファイルオブジェクトまたはファイル記述子を取ります。最初はデフォルトで、stdoutは親(スクリプト)から継承されます。 2番目のコマンドでは、1つのコマンド/プロセスから別のコマンド/プロセスにパイプできます。 3番目と4番目は、出力をファイルに書き込むためのものです。

openのようなファイルを開き、オブジェクトまたはファイル記述子の整数をcallに渡す必要があります。

f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=f)

ソケット(gasp :))のように、有効なファイルのようなオブジェクトが機能すると思いますが、試したことはありません。

marcog がstderrをリダイレクトしたいコメントに言及しているので、これをstderr=subprocess.STDOUTでstdoutと同じ場所にリダイレクトできます。上記の値はいずれも機能し、別の場所にリダイレクトできます。

128
Skurmedel

popenのオプションは、callで使用できます。

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
Shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0

そう...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=myoutput)

次に、myoutput(これはファイルである必要があります)を使用して、必要な処理を実行できます。

また、このようなパイプ出力に近いものを実行できます。

dmesg | grep hda

だろう:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]

pythonのマニュアルページ には、たくさんの素敵で役立つ情報があります。

16
ocodo