2014-09-19 69 views
1

我有一個簡單的Windows可執行文件,要求用戶輸入,我試圖做一個Python腳本來自動輸入。 我做了什麼:Popen和stdin自動化輸入到.exe

from subprocess import Popen, PIPE 
p = Popen([r'myprgm.exe'], stdin=PIPE) 
p.communicate(input=bytes(input("Test Input"), 'UTF-8')) 

現在,通常當程序運行時,它輸出到命令提示符「給我輸入:」然後期望用戶輸入。

如果我使用Popen與stdin=PIPE選項,則根本沒有任何內容寫入命令提示符 - 它只是空白處。

然後,當我使用通信時,「測試輸入」結束在python控制檯上,而不是進程。

是否有可能自動化這樣的事情?或者我在這裏丟失了一些根本......

+0

你必須在調用'communic'之前給出輸入 – Nilesh 2014-09-19 03:57:07

回答

1

您可以給input設置communicate函數。

p1 = Popen(["mycmd"], stdin=PIPE, stdout=PIPE) 
output = p1.communicate(input="my input")[0] 
+1

你還需要stdin = PIPE。 – tdelaney 2014-09-19 04:21:07

+0

對不起復制粘貼錯誤:) – Nilesh 2014-09-19 04:24:26

+0

OP使用Python 3,並且除非啓用文本模式,否則必須將'bytes'作爲'input'值傳遞。 – jfs 2015-10-12 06:20:04

0

「測試輸入」 蟒蛇控制檯

,你能看到最終的輸出,因爲input(prompt) function打印出來。如果你想從字面上傳遞Test Input到子然後放下input()電話:

#!/usr/bin/env python 
from subprocess import Popen, PIPE 

p = Popen('myprgm.exe', stdin=PIPE) 
p.communicate(input=b"Test Input") 

它不能保證myprgm.exe接受在Windows UTF-8輸入(可能使用Windows控制檯OEM編碼如cp437或接受輸入的編碼Windows ANSI編碼,如cp1252代替),因此bytes(unicode_string, 'utf-8')輸入可能是錯誤的。應該可以傳遞一個字節字符串在ascii範圍中的字節(使用b''字節字面創建))。