2009-10-28 185 views
0

我有一個應用程序,我試圖通過Python和子流程模塊進行控制。本質上,我所做的是使用Popen(打開命令提示符在其中執行程序)啓動應用程序,然後在某個時間點執行後,我需要向該程序的STDIN發送一個字符串(一條命令) 。除了在我手動在Python啓動的應用程序的命令窗口中輸入一個按鈕之前,該命令沒有得到處理這一事實之外,這很好。這裏是我的代碼的一部分:問題在Windows上使用Python的subprocess.communicate()

cmd = 'quit\n' 
app.communicate(cmd.encode('utf-8')) 

任何想法?

編輯#1

是鍵入一個按鈕是否意味着按鍵盤,遺憾的混亂上的按鍵。我已經附加更多的我的代碼如下

app = Popen(['runProg.exe', '-m', '20'], stdin=PIPE, universal_newlines=True) 
while not os.path.exists('C:/temp/quit-app.tmp'): time.sleep(1) 
app.communicate('quit') 
os.remove('C:/temp/quit-app.tmp') 

那麼會發生什麼是程序要運行,直到創建戒菸app.tmp文件;一旦創建「退出」應該發送到應用程序,這是一個乾淨關閉的命令。如果一個人在運行這個程序,他們只需在命令窗口中輸入「quit」即可。謝謝!

+0

你能否確認通過「輸入按鈕」,你的意思是按下一個鍵(鍵盤) - 我想是這樣,但只是爲了避免混淆。這是一個正常的控制檯應用程序嗎?你的Popen電話是什麼樣的?也許再多貼一點你的代碼,就沒有太多的工作要做。 – RedGlyph 2009-10-28 17:54:21

回答

0

嘗試:

cmd = 'quit\n\r' 

編輯:

只有爲我工作的事情是:

app = subprocess.Popen(["cmd.exe","testparam"],stdout=subprocess.PIPE,stdin=subprocess.PIPE) 
app.stdin.write('exit\r\n') 

因爲隨着documentation說:

Popen.communicate(輸入=無)

與進程進行互動:將數據發送到 stdin。從stdout和 stderr中讀取數據,直到達到文件結束。 等待進程終止。 可選的輸入參數應該是 字符串發送給子 過程,或者無,如果沒有數據應發送到 子。

+0

好吧,我只是試過,我仍然有同樣的問題。雖然謝謝! – Bozzy 2009-10-28 16:36:21

+0

理論上它是'\ r \ n'而不是'\ n \ r',不知道這對您的應用程序是否有所幫助。爲了避免變換字符串,可以在調用Popen時將可選'universal_newlines'參數設置爲True。通常在Windows上,管道是以二進制模式打開的,事實上,如果你不使用這個選項,你必須按照bua的建議來做(顯然還有其他的東西)。因此,無論您的問題如何,請使用此選項或添加「\ r \ n」。 – RedGlyph 2009-10-28 17:47:17

+0

請查看最後更新。 – bua 2009-10-29 07:54:49