2013-05-10 79 views
0

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

我可以在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的任何建议,让我知道。

感谢。

+0

'std :: cin.read()'有什么问题? (可能有些东西 - 我的Windows覆盖率现在很少/比较喜欢Linux)。 – 2013-05-10 01:09:42

+0

没有。这不能解决它。 cin.getline(str,buffer_size)会重复返回0个字符。所以它可能以类似的方式失败。它只是少通知为什么它的失败。 – Bob 2013-05-10 16:35:29

+0

听起来像流的错误,不可读和/或EOF状态。无论如何,为了确认问题是在Python还是C++端,你可以检查你是否可以输入input_file | your_app'并从非键盘管道正确读取它......如果是这样,那么它是python。如果没有,'std :: string line;而(getline(std :: cin,line)){...}'是对标准输入进行逐行解析的常用方法。 – 2013-05-11 06:15:32

回答

0

我想出了一个解决办法这就给一些洞察到问题的本质。我在Visual Studio中使用Windows控制台项目。我创建了一个新的“空白项目”,而是使用ReadConsole()的Windows API我使用了C++ API的std :: cin.getline()。这解决了这个问题。

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