Hello,

I am trying to port the following C++ code for IO redirection to console.

// C++ (from Synfig)

void redirectIOToConsole()
{
        int hConHandle;
        HANDLE lStdHandle;
        CONSOLE_SCREEN_BUFFER_INFO coninfo;
        FILE *fp;

        // allocate console
        if( GetStdHandle(STD_OUTPUT_HANDLE) != INVALID_HANDLE_VALUE )
                AllocConsole();
        // set the screen buffer to be big enough to let us scroll text
        GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo);
        coninfo.dwSize.Y = MAX_LINES;
        SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), 
coninfo.dwSize);
        //redirect unbuffered STDOUT to the console
        lStdHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        hConHandle = _open_osfhandle((intptr_t) lStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "w" );
        *stdout = *fp;
        setvbuf( stdout, NULL, _IONBF, 0 );
        // redirect unbuffered STDIN to the console
        lStdHandle = GetStdHandle(STD_INPUT_HANDLE);
        hConHandle = _open_osfhandle((intptr_t) lStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "r" );
        *stdin = *fp;
        setvbuf( stdin, NULL, _IONBF, 0 );
        // redirect unbuffered STDERR to the console
        lStdHandle = GetStdHandle(STD_ERROR_HANDLE);
        hConHandle = _open_osfhandle((intptr_t) lStdHandle, _O_TEXT);
        fp = _fdopen( hConHandle, "w" );
        *stderr = *fp;
        setvbuf( stderr, NULL, _IONBF, 0 );
        // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog 
        // point to console as well
        ios::sync_with_stdio();
}



My Python port:

from ctypes import windll, create_string_buffer,Structure, byref
from ctypes.wintypes import DWORD,SHORT, WORD
import os
import msvcrt
import sys

STD_INPUT_HANDLE  = -10
STD_OUTPUT_HANDLE = -11
STD_ERROR_HANDLE  = -12
INVALID_HANDLE_VALUE = DWORD(-1).value

MAX_LINES = 500

def consoleOptionEnabled(argv):
        value = False
        if ("--console" in argv) or ("-c" in argv):
                value = True
        return value

def redirectIOToConsole():
        class CONSOLE_SCREEN_BUFFER_INFO(Structure):
                _fields_ = [("dwSize", COORD),
                ("dwCursorPosition", COORD),
                ("wAttributes", WORD),
        ("srWindow", SMALL_RECT),
        ("dwMaximumWindowSize", DWORD)]

        coninfo = CONSOLE_SCREEN_BUFFER_INFO()

        # allocate console
        if(windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE) != 
INVALID_HANDLE_VALUE):
                windll.kernel32.AllocConsole()

        # set the screen buffer to be big enough to let us scroll text
        
windll.kernel32.GetConsoleScreenBufferInfo(windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE),
 byref(coninfo))
        coninfo.dwSize.Y = MAX_LINES
        
windll.kernel32.SetConsoleScreenBufferSize(windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE),
 coninfo.dwSize)

        #redirect unbuffered STDOUT to the console
        lStdHandle = windll.kernel32.GetStdHandle(STD_OUTPUT_HANDLE)

        hConHandle = msvcrt.open_osfhandle(lStdHandle, os.O_TEXT)
        fp = os.fdopen( hConHandle, "w" )
        sys.stdout = fp
        setvbuf( stdout, NULL, _IONBF, 0 )
        # redirect unbuffered STDIN to the console
        lStdHandle = windll.kernel32.GetStdHandle(STD_INPUT_HANDLE)
        hConHandle = msvcrt.open_osfhandle(lStdHandle, os.O_TEXT)
        fp = os.fdopen( hConHandle, "r" )
        sys.stdin = fp
        setvbuf( stdin, NULL, _IONBF, 0 )
        
        #redirect unbuffered STDERR to the console
        lStdHandle = windll.kernel32.GetStdHandle(STD_ERROR_HANDLE)
        hConHandle = msvcrt.open_osfhandle(lStdHandle, os.O_TEXT)
        fp = os.fdopen( hConHandle, "w" )
        sys.stderr = fp
        setvbuf( stderr, NULL, _IONBF, 0 )
        # make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog 
        # point to console as well
        

Is there a better way to handling IO redirection to console in Python?

Thanks.

Austin
-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to