Python子流程将数据重定向到标准输入

时间:2013-05-10 00:54:06

标签: c++ python windows python-2.7

我在Windows上有一个C ++程序,它从标准输入中读取字符。我想编写一个Python脚本来打开这个C ++程序,然后让脚本写入程序标准输入。

我可以在Python中成功创建子进程并从标准输出中读取。但是,程序无法通过Python脚本从标准输入接收任何内容。该程序使用ReadConsole()从标准输入读取并重复返回错误代码6(无效句柄),即使GetStdHandle()返回没有错误。

以下是程序代码:

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,请告诉我。

感谢。

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方法,可以深入了解问题的本质。我使用Windows控制台项目在Visual Studio中工作。我创建了一个新的空白项目"而不是使用ReadConsole()的Windows API我使用了std :: cin.getline()的C ++ API。这解决了这个问题。

再一次,它不是解决方案和解决方法一样多。但它表明问题似乎与Windows API或Visual Studio项目设置有关。