2012-01-17 39 views
8

嘗試將子進程的輸出重定向到文件。subprocess.Popen()IO重定向

server.py:

while 1: 
    print "Count " + str(count) 
    sys.stdout.flush() 
    count = count + 1 
    time.sleep(1) 

Laucher:

cmd = './server.py >temp.txt' 
args = shlex.split(cmd) 
server = subprocess.Popen(args) 

輸出出現在屏幕上,temp.txt保持爲空。 我在做什麼錯?

作爲背景我試圖捕獲已寫入的程序的輸出。

我不能使用:

server = subprocess.Popen(
       [exe_name], 
       stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

作爲該程序可能無法平齊。 相反,我打算通過fifo重定向輸出。這工作正常,如果我手動啓動server.py但顯然不是如果我Popen()導致重定向不起作用。 ps -aux顯示server.py已正確啓動。

回答

7

Altenatively,您可以使用stdout參數與文件對象:

with open('temp.txt', 'w') as output: 
    server = subprocess.Popen('./server.py', stdout=output) 
    server.communicate() 

正如documentation解釋說:

標準輸入,輸出和錯誤指定執行程序的標準輸入,標準輸出和標準錯誤文件句柄。有效值是PIPE,現有文件描述符(正整數),現有文件對象和None。

+0

這是有效的。溝通會阻止閱讀器,直到服務器終止,但現在我可以重定向,我可以發送服務器輸出到FIFO。 – 2012-01-17 23:37:09

+1

這裏不需要調用'.communicate()'。 'subprocess.check_call('command',stdout = file)'工作。 – jfs 2015-11-06 23:21:29

4

使用「>」輸出重定向是shell的一項功能 - 默認情況下,subprocess.Popen未實例化一個。這應該工作:

server = subprocess.Popen(args, shell=True) 
+0

使用'shell = True'不是首選的方式,除非有必要(並且它不是) – wim 2012-01-17 23:20:29