2017-11-25 152 views
1

我想在後臺使用subprocess popen執行批處理文件,但是當批處理文件中有回聲時它會停止執行。Python:在後臺批處理文件上運行subprocess.Popen停止回聲

這是我使用Python中的內容:

subprocess.Popen("test.bat", shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

這是一個示例批處理文件使用測試,我真正的批處理文件失敗,以至於即時通訊:

@ECHO OFF 
ECHO %date% %time%: Test 1 >> test.txt 
ECHO Test 1 
ECHO %date% %time%: Test 2 >> test.txt 
ECHO Test 2 

執行此操作時,它幾乎總是停在「ECHO Test 1」上,因爲text.txt文件不會填入「測試2」文本。如果您刪除或註釋掉「ECHO Test 1」,它就可以工作。在我真正的批處理文件中,這並非如此簡單,它也會在回聲結束後停止,以便在多個文件中嘗試。

它在手動執行批處理文件時起作用,因爲它在回顯後繼續。 我可以通過刪除echo:s來做一個解決方法,但如果你想手動運行批處理文件,那麼它不能很好地工作。

我做錯了什麼或者它是如何工作的?

+0

這個批處理文件與您的真實批處理文件有相同的問題嗎? –

+0

你需要命令的輸出嗎?因爲你必須在一段時間後消耗輸出,否則過程會被阻塞。 –

+0

它與真正的批處理文件有相同的問題。我不需要這個腳本中的輸出,但是如果你手動運行這個批處理文件就很有用。它啓動一個不停止的程序,這就是爲什麼它需要在後臺運行 – Meathook

回答

0

,因爲我想在批處理文件在後臺運行,我不希望它看起來像這樣的輸出工作:

subprocess.Popen("test.bat", shell=True, stdout=subprocess.DEVNULL, stderr=subprocess.STDOUT) 

或Python的< 3.3

with open(os.devnull, 'w') as f: 
    subprocess.Popen("test.bat", shell=True, stdout=f, stderr=subprocess.STDOUT) 

讓 - 弗朗索瓦法布爾幫助我,這可能是一個完整的緩衝區故障,如果我使用:

subprocess.call("test.bat", shell=True) 

它工作,但批處理文件有一個超時仍在運行,所以它不在後臺運行,所以我猜DEVNULL無視所有輸出,而不是緩衝區,所以它使工作。