コマンド ラインから次のように動作する外部プログラム 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 つの入力ファイルしか必要としなかった場合、同様の外部プログラムでサブプロセスを機能させることができたことに言及する必要があります。
どうすればこれを機能させることができますか? 複数の入力でサブプロセスを使用することは可能ですか? 私はドキュメントを見てきましたが、この質問への回答は見ていません。前もって感謝します。