我在 Windows 上有一个从标准输入读取字符的 C++ 程序。我想编写一个 Python 脚本来打开这个 C++ 程序,然后让脚本写入程序的标准输入。
我可以在 Python 中成功创建子进程并从标准输出中读取。但是,该程序无法通过 Python 脚本从标准输入中接收任何内容。该程序使用 ReadConsole() 从标准输入中读取,即使 GetStdHandle() 返回没有错误,它也会重复返回错误代码 6(无效句柄)。
这是程序代码:
char buffer[GIDE_BUFFER_SIZE];
HANDLE hConsole_c = GetStdHandle(STD_INPUT_HANDLE);
DWORD chars_read = 0;
if(hConsole_c == INVALID_HANDLE_VALUE )
{
gide_printf(LOG_ERR,"ERROR: INVALID_HANDLE_VALUE for stdout: %d.", GetLastError());
fflush(stdout);
keyboard_handler_running = false;
main_thread_running = false;
}
else if( hConsole_c == NULL)
{
gide_printf(LOG_ERR,"ERROR: Unable to get handle to standard output.");
fflush(stdout);
keyboard_handler_running = false;
main_thread_running = false;
}
gide_printf(LOG_DEBUG,"keyboard_listener thread started.");
Sleep(500); //sleep to give time for everything to come up.
print_menu();
memset(buffer, 0, sizeof(buffer));
//reads characters from console after enter is pressed.
//enter key adds CR and a LF so it adds two chars to all output.
while(keyboard_handler_running)
{
if( ReadConsole( hConsole_c, buffer, sizeof(buffer), &chars_read, NULL ) == 0)
{
gide_printf(LOG_ERR,"ERROR: Reading from console failed: %d.", GetLastError());
ErrorHandler("blah");
continue;
}
gide_printf(LOG_DEBUG,"Read %d chars from console.", chars_read);
.
.
.
.
这是 Python 脚本:
import time
import subprocess
from subprocess import Popen, PIPE, STDOUT
print '0'
proc = subprocess.Popen('program.exe', stdout=None, stdin=subprocess.PIPE, stderr=subprocess.PIPE, shell=False)
time.sleep(2)
print '1'
proc.stdin.write('xtyasmdmdjmdhjmdmjdmjd\n')
time.sleep(2)
print '2'
proc.stdin.close()
proc.stdout.close()
proc.kill()
MSDN 提到以下内容: 虽然 ReadConsole 只能与控制台输入缓冲区句柄一起使用,但 ReadFile 可以与其他句柄(例如文件或管道)一起使用。如果与已重定向为控制台句柄以外的标准句柄一起使用,ReadConsole 将失败。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms684958%28v=vs.85%29.aspx
我想知道这是否与它有关。
如果有人对如何执行此操作有任何建议,或者使用 Python 的更好方法,请告诉我。
谢谢。