2015-05-12 56 views
0

我試圖將所有的stdout重定向到文件out.txt。但是第一個命令的輸出顯示在終端上,其餘的則輸入到文件中。我不確定下面這段代碼有什麼問題。並非所有的輸出都被重定向到Python中的文件中

import os 
import sys 
import subprocess 

orig_stdout = sys.stdout 
f = file('out.txt', 'w') 
sys.stdout = f 

os.system("date") #First command 

cmd = ["ls", "-al"] 
exe_cmd = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
output, err = exe_cmd.communicate() 
print output #Second command 

sys.stdout = orig_stdout 
+0

你觀察到什麼,這導致你得出結論:'並不是所有的輸出都被重定向到文件中? – inspectorG4dget

+0

爲什麼不只是'stdout = f'? –

回答

0

分配一個文件對象sys.stdout重定向使用sys.stdout但並不重定向使用底層文件描述符代碼Python代碼。

os.system("date") 

產生一個使用底層文件描述符的新進程,所以它沒有重定向。

exe_cmd = subprocess.Popen(cmd, stdout=subprocess.PIPE) 
output, err = exe_cmd.communicate() 
print output #Second command 

產生一個新的進程,由父進程讀取管道。 print使用父母sys.stdout,因此它被重定向。

重定向的標準方法是將文件對象交給subprocess調用之一。孩子直接寫入沒有父母互動的文件。

with open('out.txt', 'w') as f: 
    cmd = ["ls", "-al"] 
    subprocess.call(cmd, stdout=f) 
+0

非常感謝。因此,這僅適用於第二個命令。那麼我需要爲每個命令創建2個文件單獨的文件嗎?由於「With open」會在os.system(「date」)被重定向之前提前關閉文件。 –

+0

如果可以,避免使用'os.system'。 'subprocess'使文件重定向更容易。您可以使用'os,dup2'來更改底層的文件描述符,但它更難。如果你想要所有的命令stdout和stderr去一個文件,打開它一次,併爲它們執行'subprocess.call(cmd,stdout = f,stderr = subprocess.STDOUT)'。至於'open',所有重要的是在命令產生時的文件描述符。對於'os.system'和'subprocess.call',父母等待直到孩子退出,所以它沒有區別。 – tdelaney

相關問題