代码之家  ›  专栏  ›  技术社区  ›  Toji

将嵌入式Python IO重定向到使用AllocConsole创建的控制台

  •  9
  • Toji  · 技术社区  · 15 年前

    我在将Python IO重定向到为Win32应用程序分配的控制台时遇到一些问题。是否有需要重定向的Python特定流?

    下面是我现在所做的(删除错误检查等):

    int __stdcall WinMain(/*Usual stuff here*/) {
        // Create the console
        AllocConsole();
        SetConsoleTitle(L"My Console");
    
        // Redirect Standard IO Streams to the new console
        freopen("CONOUT$","w",stdout);
        freopen("CONOUT$","w",stderr);
        freopen("CONIN$","r",stdin);
    
        // Test the console:
        printf("This Works.\r\n");
        cout << "So Does this" << endl;
    
        // Python Stuff (This is where it fails)
        Py_Initialize();
        PyRun_SimpleString("print('I don't work.')\n");
        Py_Finalize();
    }
    

    编辑:只是为了澄清,我正在寻找一种从C API实现的方法。

    PyObject* sys = PyImport_ImportModule("sys");
    PyObject* io = PyImport_ImportModule("io");
    PyObject* pystdout = PyObject_CallMethod(io, "open", "ss", "CONOUT$", "wt");
    if (-1 == PyObject_SetAttrString(sys, "stdout", pystdout)) {
        /* Announce your error to the world */
    }
    Py_DECREF(sys);
    Py_DECREF(io);
    Py_DECREF(pystdout);
    
    2 回复  |  直到 14 年前
        1
  •  10
  •   Alex Martelli    15 年前

    设置 sys.stdout 在Python方面(可能是 open('CONOUT$', 'wt') print 工作,同样的 sys.stderr sys.stdin import sys 在前面;-)。

    原因:因为Python的运行时在启动时发现标准FDs已关闭,所以 因此,不会再次检查并以不同的方式设置它们——所以您只需自己明确地设置它们,就可以了。

    如果您热衷于在C-API级别上完成这一切,这将需要几行代码,但当然可以做到。。。

    PyObject* sys = PyImport_ImportModule("sys");
    PyObject* pystdout = PyFile_FromString("CONOUT$", "wt");
    if (-1 == PyObject_SetAttrString(sys, "stdout", pystdout)) {
      /* raise errors and wail very loud */
    }
    Py_DECREF(sys);
    Py_DECREF(pystdout);
    

    这完全等同于单个Python行:

    sys.stdout = open('CONOUT$', 'wt')
    
        2
  •  1
  •   Extreme Coders    10 年前

    只告诉嵌入式python将其输出重定向到一个文件要容易得多。

    PyRun_SimpleString("import sys\n");
    PyRun_SimpleString( "sys.stdout = sys.stderr = open(\"C:\\embedded_log_file.txt\", \"w\")\n" );