在bash,你可以一個過程的輸出很容易地重定向到一個臨時文件的描述符,它是所有的bash這樣的自動處理的:擊風格處理替代
$ mydaemon --config-file <(echo "autostart: True \n daemonize: True")
或像這樣:
$ wc -l <(ls)
15 /dev/fd/63
看看它是如何不標準輸入重定向:
$ vim <(echo "Hello World")
vim opens a text file containing "Hello world"
$ echo "Hello World" | vim
Vim: Warning: Input is not from a terminal
可以在第二前看充足的bash是如何自動創建一個文件描述符,並允許您將程序的輸出傳遞給另一個程序。
現在到我的問題:如何在Python中使用Popen在子進程模塊中做同樣的事情?
我一直在使用kmers的正常文件,只是讀它,但我的程序現在基於用戶參數在運行時生成一個特定的kmers列表。我想避免手動寫入臨時文件,因爲處理文件權限可能會對我的原始用戶造成問題。
這裏是我的代碼運行了一個程序,用一個實際的文件捕獲標準輸出「kmer_file」
input_file = Popen(["pram_axdnull", str(kmer), input_file, kmer_file], stdout=PIPE)
我創建了一個名爲generate_kmers函數返回一個可以很容易地寫出到一個文件中的字符串(包括換行符)或一個StringIO。我也有一個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選項並使用<()的實際雙擊,但我沒有想到這一點。
謝謝!
相關:[在子進程多個管道(http://stackoverflow.com/q/28840575/4279) – jfs 2015-09-22 10:51:15