Python - Запустите простую программу командной строки с запросом ввода-вывода и «прокси» в Windows - PullRequest
1 голос
/ 12 декабря 2011

У меня есть простая двоичная программа командной строки hello, которая выводит в STDOUT:

What is your name?

и ждет, пока пользователь введет его. После получения их ввода он выводит:

Hello, [name]!

и завершается.

Я хочу использовать Python для выполнения вычислений в окончательном выводе этой программы ("Hello, [name]!"), однако перед окончательным выводом я хочу, чтобы скрипт Python по существу "был" двоичной программой. Другими словами, я бы хотел, чтобы Python перенаправил все запросы в STDOUT, а затем принял ввод пользователя и передал его программе. Однако я хочу скрыть окончательный вывод, чтобы обработать его и показать свои результаты пользователю. Я не хочу копировать поведение hello в скрипте, так как эта простая программа является заменой для более сложной программы, с которой я на самом деле работаю.

Я надеялся, что в subprocess будет какая-то механика, где я смогу сделать что-то похожее на:

while process.is_running():
    next_char = process.stdout.read(1)
    if next_char == input_prompt_thing: # somehow check if the program is waiting for input
        user_input = raw_input(buffer)
        process.stdin.write(user_input)
    else:
        buffer += next_char

Я играл с subprocess и, по сути, дошел до того, что понял, что могу использовать process.stdout.read(1) для чтения из программы до того, как она начала блокироваться, но я не могу понять, как разорвать этот цикл перед блоками процесса мой скрипт на Python. Я не слишком знаком с консольным вводом / выводом, и это не является для меня большой областью знаний, поэтому я начинаю чувствовать себя довольно растерянным. Я ценю любую помощь!

1 Ответ

1 голос
/ 12 декабря 2011

Вы можете попробовать winpexpect (не тестировалось):

import re
from winpexpect import winspawn

p = winspawn('hello')
prompt = "What is your name?"
p.expect(re.escape(prompt))
name = raw_input(prompt)
p.sendline(name)
p.expect("Hello, .*!")
output = p.after
# ... 
...