3

サブプロセスを介して起動したいプログラムがあります。stdoutとstderr以外のfdに出力できます。任意のfdからデータをキャプチャする方法はありますか?プロセスが出力をfd9に送信している場合、次のようなことをしたいと思います。

import subprocess, StringIO
redirector = StringIO.StringIO()
errno = subprocess.call(cmd, fd9=redirector)
#process the error code and data in redirector

呼び出されたプロセスの出力をstderrまたはstdoutを介してfd9にリダイレクトしたくありません。

4

1 に答える 1

3

プログラムが実行開始後にファイル記述子9(またはその他)を開いた場合、必要な処理を実行する方法はありません。

プログラムがファイル記述子9自体を開かずpreexec_fn、親プロセスから取得する場合は、の引数を使用して必要な処理を実行できますが、インスタンスsubprocess.Popenに何かを設定するほど簡単ではありません。StringIO手作業でパイプを作成し、タイムリーにパイプを読み取るように手配する必要があります。そうしないと、デッドロックが発生します。これを100%正しくするために、200行または300行のコードを書くことを期待してください。見た目を簡単にしたくないので、ここにサンプルコードを入れるつもりはありません。

に加えて、、、、およびがsubprocess.Popen必要os.pipeになります。また、基礎となるシステムプリミティブ(、、、、、、および)を理解する必要が あります。os.dup2os.readpipe(2)dup2(2)read(2)fork(2)execve(2)

今は、Unix環境での高度なプログラミングのコピーに投資する良い機会かもしれません。

于 2012-09-25T19:19:48.093 に答える