过程.沟通getche()失败

2024-09-22 16:31:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图自动执行C++中的交互式命令行工具的执行。在

启动时,二进制文件等待字母S、Q或p(状态、退出或暂停)。它使用一个非标准的msvcrt函数“getche”来获取键笔划(而不是gets()),而不需要用户按enter键。在

我尝试以标准方式与进程通信(写入stdin并使用过程.沟通[]),但无法获得输入。在尝试了几个小时的不同尝试之后,我在visualstudio中创建了两个小的示例项目来复制这个问题,并确保我是正常的(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"

这是两个二进制文件。我能与之沟通的第一个问题是:

^{pr2}$

我无法与之交流的是:

#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,可能监听某种键盘事件。有人知道怎么处理吗?在

编辑: 我还应该提到,我发现了使用idapro捕捉输入的方法。我没有编写我试图自动化的原始二进制文件。它是一个封闭源代码的工具,所以我无法重新编写它如何接受输入而不修补二进制文件。在

我实际上选择了一个相当疯狂的解决方案。。。我对pydbg非常了解,似乎附加到流程并通过流程检测调用我需要的函数是可行的。这完全是过火了,但我可以从这个过程中分离出来。让它正常运行。在

[1]Pydbg:http://pedram.redhive.com/PyDbg/docs/


Tags: 文件工具函数importtime过程responsestdin
2条回答

getche控制台读取,而不是从标准输入读取。如果Python进程在控制台窗口中运行,则子进程仍将尝试从同一控制台读取输入,而不是作为标准输入传入的管道。在

也许可以创建另一个不可见的控制台窗口,将其附加到子进程,并为其提供输入,但这非常复杂且容易出错。在

我建议您重写程序,只读取标准输入,而不使用getche()。如果你真的想让它对击键做出反应而不需要用户按Enter键,那么我建议让它根据标准输入是否来自终端来改变其行为。如果是,使用getche,如果不是,直接从stdin读取。您可以使用^{}(或等效的POSIX isatty;由于某些原因,Microsoft决定在其运行时不推荐使用POSIX名称)。例如:

int ReadChar()
{
    if(_isatty(0))
    {
        // stdin is a terminal
        return _getche();
    }
    else
    {
        // stdin is not a terminal
        return getchar();
    }
}

如果您可以修改被调用程序的行为,那么adamrosenfield的答案是一种明智的方法。否则,如果确实需要写入控制台输入缓冲区,请尝试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:

^{pr2}$

相关问题 更多 >