gpt4 book ai didi

python - process.communicate 和 getche() 失败

转载 作者:可可西里 更新时间:2023-11-01 09:21:27 25 4
gpt4 key购买 nike

我正在尝试自动执行用 C++ 编写的交互式命令行工具。

启动时,二进制文件等待字母 S、Q 或 P(状态、退出或暂停)。它使用非标准的 msvcrt 函数“getche”来获取击键(而不是例如 gets()),而无需用户按回车键。

我尝试以标准方式与进程通信(写入标准输入并使用 process.communicate[]),但它没有获得输入。在尝试不同的事情几个小时后,我在 Visual Studio 中创建了两个小示例项目来重现问题并确保我是理智的(大概)。

这是用于调用二进制文件的 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/

最佳答案

如果您可以修改被调用程序的行为,Adam Rosenfield 的回答是一个明智的方法。否则,如果您确实需要写入控制台输入缓冲区,请尝试 PyWin32 的 win32console 模块。也就是说,我不确定在通过管道传输 stdout 时如何使字符回显部分正常工作。它最终打印到行的开头。

C:

#include <stdio.h>

int main(int argc, char *argv[]) {
int response;
printf("Enter \"a\": ");
response = getche();
printf("\nYou entered \"%c\" ", response);
return 0;
}

/* gcc test_getch.c -o test_getch.exe */

python :

import subprocess
import win32console

def make_buf(c):
buf = win32console.PyINPUT_RECORDType(win32console.KEY_EVENT)
buf.KeyDown = 1
buf.RepeatCount = 1
buf.Char = c
return buf

con_in = win32console.GetStdHandle(win32console.STD_INPUT_HANDLE)

cmd = ["test_getch.exe"]
p = subprocess.Popen(cmd, stdin=subprocess.PIPE)

buf = make_buf('a')
con_in.WriteConsoleInput([buf])

关于python - process.communicate 和 getche() 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8117055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com