Bashでは、プロセスの出力を一時ファイル記述子に簡単にリダイレクトでき、すべて次のようにbashによって自動的に処理されます。
$ mydaemon --config-file <(echo "autostart: True \n daemonize: True")
またはこのように:
$ wc -l <(ls)
15 /dev/fd/63
stdinリダイレクションではないことを確認してください。
$ vim <(echo "Hello World")
vim opens a text file containing "Hello world"
$ echo "Hello World" | vim
Vim: Warning: Input is not from a terminal
2番目の例では、bashがファイル記述子を自動的に作成し、プログラムの出力を別のプログラムに渡すことができる方法を確認できます。
今私の質問に移ります:サブプロセスモジュールでPopenを使用して、Pythonで同じことをどのように行うことができますか?
私はkmersの通常のファイルを使用してそれを読み込んでいますが、私のプログラムはユーザーパラメータに基づいて実行時にkmersの特定のリストを生成するようになりました。ファイルのアクセス許可を処理すると、プリミティブユーザーに問題が発生する可能性があるため、一時ファイルに手動で書き込むことは避けたいと思います。
これが私のプログラムを実行し、実際のファイル「kmer_file」でstdoutをキャプチャするための私のコードです
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
ファイル(改行を含む)またはStringIOに簡単に書き出すことができる文字列を返すgenerate_kmersという関数を作成しました。同じことをするためにスタンドアロンのPythonスクリプトもあります
だから今私はそれを私の3番目のパラメーターとして渡したい:
これは機能しません:
kmer_file = stringIO(generate_kmers(3))
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
これもしません:
kmer_file = Popen(["generate_kmers", str(kmer)], stdout=PIPE)
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file.stdout], stdout=PIPE)
だから私はアイデアがありません。
誰かがこれを解決するための良い方法を知っていますか?私はshell=Trueオプションを使用し、<()の実際のバシズムを使用することを考えていましたが、それを理解していません。
ありがとうございました!