embedding Python interpreter in non-console windows application
Hello, THE PROBLEM: I am having a problem that I have seen asked quite a bit on the web, with little to no follow up. The problem is essentially this. When embedding (LoadLibraryA()) the python interpreter dll in a non-windows application the developer must first create a console for python to do output/input with. I properly initialize the CRT and AllocConsole() to do this. I then GetSTDHandle() for stdin and stdout accordingly and open those handles with the requisite flags "read" for STDIN and "write" for stdout. This all works great and is then verified and tested to work by printf() and fgets(). This issue however happens when attempting to PyRun_InteractiveLoop() and PyRun_SimpleString(). A PyRun_SimpleString("print 'test'") displays nothing in my freshly allocated console window. Similarly a PyRun_InteractiveLoop(stdin, NULL); yields nothing either even though the line printf("testing"); directly ahead of it works just fine. Does anyone have insight on how I can make this work with the freshly allocated console's stdin/stdout/stderr? SPECULATION: That is the question, so now on to the speculation. I suspect that something in the python runtime doesn't "get handles" correctly for STDIN and STDOUT upon initialization. I have perused the source code to find out exactly how this is done and I suspect that it starts in PyInitializeEx with calls to PySys_GetObject("stdin") and "stdout" accordingly. However I don't actually see where this translates into the Python runtime checking with the C-runtime for the "real" handles to STDIN and STDOUT. I dont ever see the Python runtime "ask the system" where his handles to STDIN and STDOUT are. SUBSEQUENT QUESTION: Is there anything I can do to initialize the Python interpreter (running as a dll) pointing him at his appropriate STDIN and STDOUT handles?
stephen, 17.02.2010 06:49:
THE PROBLEM: I am having a problem that I have seen asked quite a bit on the web, with little to no follow up.
Note that this list is about developing the CPython core runtime, not about solving problems with Python code or Python usage. See the comp.lang.python newsgroup for that (or the corresponding mailing list mirror). Stefan
Hi, 2010/2/17 stephen <stephen@blackroses.com>
Hello,
THE PROBLEM: I am having a problem that I have seen asked quite a bit on the web, with little to no follow up. The problem is essentially this. When embedding (LoadLibraryA()) the python interpreter dll in a non-windows application the developer must first create a console for python to do output/input with. I properly initialize the CRT and AllocConsole() to do this. I then GetSTDHandle() for stdin and stdout accordingly and open those handles with the requisite flags "read" for STDIN and "write" for stdout. This all works great and is then verified and tested to work by printf() and fgets(). This issue however happens when attempting to PyRun_InteractiveLoop() and PyRun_SimpleString(). A PyRun_SimpleString("print 'test'") displays nothing in my freshly allocated console window. Similarly a PyRun_InteractiveLoop(stdin, NULL); yields nothing either even though the line printf("testing"); directly ahead of it works just fine. Does anyone have insight on how I can make this work with the freshly allocated console's stdin/stdout/stderr?
SPECULATION: That is the question, so now on to the speculation. I suspect that something in the python runtime doesn't "get handles" correctly for STDIN and STDOUT upon initialization. I have perused the source code to find out exactly how this is done and I suspect that it starts in PyInitializeEx with calls to PySys_GetObject("stdin") and "stdout" accordingly. However I don't actually see where this translates into the Python runtime checking with the C-runtime for the "real" handles to STDIN and STDOUT. I dont ever see the Python runtime "ask the system" where his handles to STDIN and STDOUT are.
Are you using the same compiler as the one used to compile Python? It's important that your program and python use the same C runtime library (MSVCR90.dll for python 2.6), otherwise "stdout" refers to different things. -- Amaury Forgeot d'Arc
participants (3)
-
Amaury Forgeot d'Arc -
Stefan Behnel -
stephen