[Python-Dev] Create a synthetic stdout for Windows?

Mark Hammond MarkH@ActiveState.com
Mon, 8 Jan 2001 09:04:31 -0800

> Is this a good idea?  If so, is the implementation optimal

Im really on the fence here.  Note however that your solution does not solve
the original problem.  Eg, your example is:

> On December 30, 2000 gerson.kurz@t-online.de (Gerson Kurz) writes:
>    If I embedd Python in a Win32 console application (using
>    Demo\embed.c), everything works fine. If I take the very same piece

But your solution involves:

> The file WinMain.c calls PyWin_StdoutReplace() before it
> calls Py_Main(), and PyWin_StdoutPrint() afterwards.  This

Note that the original problem was _embedding_ Python - thus, you need to
patch _their_ WinMain to make it work for them - something you can't do.

Even if PyWin_StdoutReplace() was a public symbol so they _could_ call it, I
am not convinced they would - it is almost certain they will still need to
redirect output to somewhere useful, so why bother redirecting it
temporarily just to redirect it for real immediately after?

Finally, I am slightly concerned about the possibility of "hanging" certain
programs. For example, I believe that DCOM will often invoke a COM server in
a different "desktop" than the user (this is also true for Services, but
Python services don't use pythonw.exe).  Thus, a Python program may end up
hanging with a dialog box, but in the context where no user is able to see
it.  However, this could be addressed by adding a command-line option to
prevent this new behaviour kicking in.

I would prefer to see a decent API for extracting error and traceback
information from Python.  On the other hand, I _do_ see the problem for
"newbies" trying to use pythonw.exe.

So - I guess I am saying that I don't see this as optimal, and it doesnt
solve the original problem you pointed at - but in the interests of making
pythonw.exe seem "less broken" for newbies, I could live with this as long
as I could prevent it when necessary.

Another option would be to use the Win32 Console APIs, and simply attempt to
create a console for the error message.  Eg, maybe PyErr_Print() could be
changed to check for the existance of a console, and if not found, create
it.  However, the problem with this approach is that the error message will
often be printed just as the process is terminating - meaning you will see a
new console with the error message for about 0.025 of a second before it
vanishes due to process termination.  Any sort of "press any key to
terminate" option then leaves us in the same position - if no user can see
the message, the process appears hung.