0

標準入力から文字を読み取る Windows 上の C++ プログラムがあります。この 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 を使用するより良い方法について提案がある場合は、お知らせください。

ありがとう。

4

1 に答える 1

0

問題の性質についての洞察を与える回避策を見つけました。Windows コンソール プロジェクトを使用して Visual Studio で作業しています。新しい「空のプロジェクト」を作成し、ReadConsole() の Windows API を使用する代わりに、std::cin.getline() の C++ API を使用しました。これで問題は解決します。

繰り返しますが、これは回避策ほどの解決策ではありません。しかし、Windows API または Visual Studio プロジェクトの設定に問題があるようです。

于 2013-05-13T16:56:21.197 に答える