【发布时间】:2011-12-28 08:36:28
【问题描述】:
我正在尝试自动执行用 C++ 编写的交互式命令行工具。
启动时,二进制文件会等待字母 S、Q 或 P(状态、退出或暂停)。它使用非标准的 msvcrt 函数“getche”来获取击键(例如,而不是 get()),而无需用户按 Enter。
我尝试以标准方式与进程通信(写入标准输入并使用 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() 似乎没有在标准输入上侦听,并且可能在侦听某种键盘事件。有谁知道如何处理这个问题?
编辑: 我还应该提到我发现了使用 IDA Pro 捕获输入的方法。我没有编写我试图自动化的原始二进制文件。它是一个闭源工具,所以我无法在不修补二进制文件的情况下重写它如何接受输入。
我实际上选择了一个相当疯狂的解决方案......我非常了解 pydbg,而且似乎附加到进程并通过进程检测调用我需要的函数是可行的。这完全是矫枉过正,但之后我可以脱离这个过程。并让它正常运行。
[1] Pydbg:http://pedram.redhive.com/PyDbg/docs/
【问题讨论】:
-
使用
process.communicate("S\n")而不是i.write()。如果您使用.communicate(),请勿触摸process.stdin。虽然它对你的情况没有帮助。
标签: python windows subprocess popen