2013-02-26 2 views
1

Мы пытаемся создать скрипт python для установки приложения через приглашение оболочки Windows, выполняя наш скрипт python. У нас есть выход приглашение от App.exe индикации «Нажмите Enter, чтобы продолжить ...»нажмите enter через скрипт python

Мы пытались имитировать Enter ключ, но он не работает. Запрос просто сидит, не переходя к следующему шагу мастера.

Как мы преодолеем эту проблему?

import subprocess 
import win32console 

APP_BIN = 'app.exe' 

def main(): 
    proc = subprocess.Popen([APP_BIN,'-i','console'],stdin=subprocess.PIPE, 
                stdout=subprocess.PIPE) 
    proc.stdin.write("\r\n")   <--- issue 
    output = proc.stdout.readline()  <--- issue 
    print output 
    ret = proc.wait() 
    print ret 

if __name__ == '__main__': 
    main() 
+0

'proc.stdin', скорее всего, в буфер. Если вам нужно будет выполнить 'proc.stdin.flush()', чтобы убедиться, что процесс получил все отправленные вами символы. Я не знаю, поможет ли это решить вашу проблему. –

ответ

3

Не совсем уверен, как это сделать в Python, но мое предложение было бы смоделировать реальную «Enter» ключ команды нажмите. В вашем коде вы просто меняете позицию каретки и не получаете надлежащего возврата.

Посмотрите на это: http://win32com.goermezer.de/content/view/136/254/

import win32com.client 
shell = win32com.client.Dispatch("WScript.Shell") 
shell.SendKeys("{ENTER}", 0) 

Похоже, что это именно то, что вам нужно.

+0

Добавьте пример небольшого кода, и он будет +1 от меня, на всякий случай, когда ссылка умрет. – Serdalis

+0

Пример кода. – ZorleQ

+0

Привет, Зорле поблагодарил за ответ; я попытался и по-прежнему имеет тот же эффект, не поймав клавишу Enter. – chz

0

Следующее может работать (непроверенные):

import subprocess 
import win32console 

APP_BIN = 'app.exe' 

def main(): 
    proc = subprocess.Popen([APP_BIN,'-i','console'],stdin=subprocess.PIPE, 
                stdout=subprocess.PIPE) 
    stdoutdata, stderrdata = proc.communicate(input="\r\n") 
    output = stdoutdata.readline() 
    print output 
    ret = proc.wait() 
    print ret 

if __name__ == '__main__': 
    main() 
+0

Привет, Мартино спасибо за ответ. Это не работает - все тот же эффект; не видел ввода ключа ввода, чтобы нажать на следующий шаг мастера. – chz

+0

Плохо. Возможно, приложение не читает stdin, и в этом случае вам, вероятно, придется использовать один из других модулей PyWin32, чтобы делать то, что вы хотите. Попробуйте «Google» имитировать клавиатурный ввод ». Есть что-то, называемое [pywinauto] (http://pywinauto.googlecode.com/hg/pywinauto/docs/index.html), которое может работать и для консольных приложений. – martineau

+0

А, этот [ответ] (http://stackoverflow.com/a/723724/355230) может помочь. – martineau

Смежные вопросы