0

コマンド ラインから次のように動作する外部プログラム hmm3align を呼び出す必要がある Python プログラムを作成しています。

hmm3align hmm_file fasta_file -o output_file

したがって、通常、プログラムは 2 つの入力ファイルを想定し、結果を 3 番目のファイルに書き込みます。私のプログラムには、実際には外部プログラムを呼び出すケースが複数ありますが、外部プログラムに 2 つのファイル入力があるのはこれだけです。私の意図は、ファイルの書き込みと読み取りを避けて、これらの外部プログラムが相互に通信できるようにすることです。セッション中にすべてのデータを Python 変数として保存し、必要に応じてこれらの変数を外部プログラムにフィードしたいと考えています。

Python プログラムで hmm3align を呼び出す必要がある時点で、通常は hmm_file と fasta_file にそれぞれ含まれる情報を含む 2 つの Python 変数 hmm_model と fasta_model が既にあります。私がやりたいことは、hmm_model と fasta_model を stdin 経由で渡して hmm3align を呼び出し (入力としてフィードする唯一の方法だと思うため)、stdout からの結果を align_results という名前の 3 番目の Python 変数にキャプチャすることです。これを行うために、次のように subprocess モジュールを使用する別の関数を作成しました。

def hmmalign(hmm_model,fasta):
     args = ["/clusterfs/oha/software/bin/hmm3align",
             "-", "-",
             "-o", "/dev/stdout"]
     process = subprocess.Popen(args, shell=False, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
     return process.communicate(hmm_model,fasta)[0]

ご覧のとおり、標準入力経由で両方の変数を送信しようとしています。args リストの 2 つの「-」は、これら 2 つの変数をキャプチャするためのものです。他の例で「-」が使用されているのを見たことがありますが、それらの目的が明確ではなく、誤解している可能性があります。

案の定、トレースバックの最後に次のエラーが表示されます。

TypeError: communicate() takes at most 2 arguments (3 given)

そのため、stdin を介して 2 つの個別の変数をプログラムに渡すことはできません。そのプログラムが 1 つの入力ファイルしか必要としなかった場合、同様の外部プログラムでサブプロセスを機能させることができたことに言及する必要があります。

どうすればこれを機能させることができますか? 複数の入力でサブプロセスを使用することは可能ですか? 私はドキュメントを見てきましたが、この質問への回答は見ていません。前もって感謝します。

4

1 に答える 1

1

標準入力は単一のデータ ストリームです。Unix では、単方向パイプの出力端に接続されたファイル記述子です。慣例により、コマンド ラインで指定された単一のファイルから読み取るプログラムは、ファイルからではなく stdin から読み取る命令として認識されます。ただし、2 つのファイルから読み取るプログラムの場合、stdin は 1 つのデータ ストリームであるため、stdin から 2 回読み取る方法はありません。-

通信に使用できるファイル記述子は他にもあります (stdin は fd 0、stdout は fd 1、stderr は fd 2) が、ファイルの代わりにそれらを指定する従来の方法はありません。

ここで機能する可能性が最も高いソリューションは、名前付きパイプ(FIFO) です。Python ではos.mkfifo、名前付きパイプの作成とos.unlink削除に使用します。次に、その名前をプログラムに渡すことができます (読み取り可能なファイルとして表示されますopen)。

于 2012-06-21T16:59:15.027 に答える