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


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

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

これをテキストファイルにパイプする方法も教えてください。(また、可能であれば印刷します)

回答:


171

出力をファイルに書き込む場合は、stdout -argument ofを使用できますsubprocess.call

それはとり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=subprocess.STDOUT。上記のいずれの値も機能し、別の場所にリダイレクトできます。


5
subprocess.call(["echo"、 "1"、 ">>"、 "t.txt"])が機能しないのはなぜですか?
StackOverflowOfficial 2017

7
@Goldnameリダイレクトを行うにはシェルが必要なので、動作するsubprocess.call(["echo", "1", ">>", "t.txt"], shell=True)はずです。
ウェス・メイソン

@WesMasonありがとう、しかし、subprocess.callは基本的にシェルにコピーして貼り付けるような方法で機能すると思いましたか?
StackOverflowOfficial 2017

2
@Goldname nah、サブプロセスのすべてがプロセスを開く、基盤となるPopenクラスに依存しています。shell= Trueは、システムのデフォルトシェル(例:bashまたはdashであるPOSIXシステムの/ bin / sh)でプロセスを強制的に実行します。 )、シェルによって提供されるすべての追加機能(それ自体がプログラミング言語全体であり、ユーザーが提供するデータを渡すと独自のエクスプロイトを使用する)に開かないので、より安全です。また、shlex.quoteダーティデータがサブシェルに渡されていないかどうかも確認してください。
ウェス・メイソン

4
完了したら、ファイルも閉じる必要がありますか?これにより、完了後にファイルが閉じられます。with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @ Skurmedel
alper

18

のオプションはpopencall

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のマニュアルページには、たくさんの素敵で便利な情報があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.