2012-03-07 75 views
2

據python文檔http://docs.python.org/library/subprocess.html,建議與POPEN類取代os.popen,現在我有以下命令:os.popen命令轉換爲subprocess.Popen實例

import os 
c = "openssl dgst -sha1 -sign /foo/1 /bar/1 | openssl enc -base64 -A" 
my_value = os.popen(c).read() 

我明白Popen將命令作爲字符串參數的列表,當我嘗試傳遞管道(「|」)時,它會如何中斷,我也明白這是由於「|」在bash中有一個特殊的含義,如何不知道如何解決這個問題。

另一個問題是Popen實例沒有read方法,所以我不確定以什麼方式查看輸出。

我正在使用Django Framework,所以如果在框架中還有一個函數可能會幫助也是一個選項。

回答

3

如果你看看文檔中的Replacing the shell pipeline部分,你會看到你的例子可以寫成使用subprocess如下:

from subprocess import Popen, PIPE           
p_dgst = Popen("openssl dgst -sha1 -sign /foo/1 /bar/1".split(), 
       stdout=PIPE) 
p_enc = Popen("openssl enc -base64 -A".split(), 
       stdin=p_dgst.stdout, stdout.PIPE) 
my_value = p_enc.communicate()[0] 
+1

是否有一些文件爲什麼'os.popen'應該被替換?上面的代碼看起來比簡單的'os.popen'調用更復雜。 – 2015-05-18 17:50:05

2

爲了讓子進程運行shell管道,使用選項shell=True

subprocess.Popen(command, shell=True)