Я пытаюсь автоматизировать выполнение интерактивного инструмента командной строки, написанного на C ++.
При запуске двоичный файл ожидает буквы S, Q или P (Status, Quit или Pause).Он использует нестандартную функцию msvcrt "getche" для получения нажатия клавиши (например, вместо get ()) без необходимости нажимать клавишу ввода.
Я пытался общаться с процессом стандартным способом (написаниев stdin и используя process.communicate []), но он не получает ввод.После нескольких часов попыток по-разному я создал два небольших примера проекта в Visual Studio, чтобы воспроизвести проблему и убедиться, что я в здравом уме (ish).
Это сценарий python, используемый для вызова двоичного файла:
import subprocess
import time
cmd = ["test-getch.exe"]
process = subprocess.Popen(cmd, stderr = subprocess.PIPE, stdin = subprocess.PIPE, stdout = subprocess.PIPE)
i = process.stdin
#msvcrt.ungetch('s')
i.write("S\n")
print process.communicate()[0]
i.close()
time.sleep(3)
print "DONE"
Это два двоичных файла.Это первое, с которым я могу общаться:
#include "stdafx.h"
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
char response [2];
printf("Enter \"s\":\n");
gets(response);
printf("You entered %s", response);
return 0;
}
Это первое, с чем я не могу общаться:
#include "stdafx.h"
#include <conio.h>
int _tmain(int argc, _TCHAR* argv[])
{
int response;
printf("Enter \"a\":\n");
response = getche();
printf("You entered %c", response);
return 0;
}
Похоже, что getche () не слушает stdin и, вероятно, слушаетдля какого-то события клавиатуры.Кто-нибудь знает, как справиться с этим?
РЕДАКТИРОВАТЬ: Я должен также упомянуть, что я обнаружил метод захвата ввода с использованием IDA Pro.Я не написал оригинальный двоичный файл, который я пытаюсь автоматизировать.Это инструмент с закрытым исходным кодом, поэтому у меня нет возможности переписать, как он принимает ввод, не исправляя двоичный файл.
На самом деле я выбрал довольно безумное решение, которое работает ... Я хорошо знаю pydbg икажется, что подключение к процессу и вызов нужных мне функций с помощью инструментария процесса работает.Это полностью излишне, но я могу отойти от процесса потом.и пусть он работает нормально.
[1] Pydbg: http://pedram.redhive.com/PyDbg/docs/