[C++-sig] How to get output from python embedded in VC++

Stefan Seefeld stefan at seefeld.name
Thu Jul 20 10:34:35 EDT 2017


On 19.07.2017 23:25, Jian wrote:
>
> Dear Gurus,
>
> I want to embed python interpreter in my program. What I want is to
> redirect those output to a control such as RICHEDIT which can be
> modified as a output window in my program. So I can write *.py files
> outside of program and invoke it inside program as a script file. In
> order to get information output by the *.py file I need to get the
> stdin&stdout. I have tried some workflow but not perfect.
>

So you want to capture all output produced by the Python session,
without changing the behaviour of `std::cout` or `printf()`, correct ?

> 1). I have tried use Allocconsle(). But I can only get the output info
> printed by std::out & printf() in the current code. all things which
> are printed by python35.dll are missing. I used print('xxxx') in the
> *.py file to test the output. Those *.py files are OK in command line
> mode.
>
> 2). I also tried to derive class basic_streambuf and overwrite the
> in/out functions. It works only for output from std::out. Text from
> printf() as well as from dlls are missing.
>
> 3). then I tried to use linker settings as below.
>
> #pragma comment( linker, "/subsystem:console /entry:wWinMainCRTStartup" )
>
> A cmd window is created along with the program. everything output from
> current process and dlls are retrieved successfully as I want. But the
> cmd window is not easy to control.
>
> Is there a better way for this purpose?
>

I suggest you import the `sys` module and substitute `sys.stdout` and
`sys.stderr` to capture output rather than send to stdout and stderr.
The technique is described in many places, for example
https://www.blog.pythonlibrary.org/2016/06/16/python-101-redirecting-stdout/.
Please be aware that due to the way Python3 changed its representation
of strings (, unicode, bytes, etc.) you may have to be careful to find a
solution that works portably.

You could do this either in a Python wrapper script, or directly in the
code you use to initialize your Python session (in C++).

I'm only a casual Windows user (and even less programmer), so can't
comment on any Windows-specific idioms to use.

HTH,
        Stefan

-- 

      ...ich hab' noch einen Koffer in Berlin...



More information about the Cplusplus-sig mailing list