stdin in embedded python

Dave Angel davea at ieee.org
Sun Nov 1 21:13:10 EST 2009


Gabriel Genellina wrote:
> En Sun, 01 Nov 2009 13:34:44 -0300, KillSwitch 
> <gu.yakahughes at gmail.com> escribió:
>> On Nov 1, 5:34 am, Dave Angel <da... at ieee.org> wrote:
>>> KillSwitch wrote:
>
>>> > I have a C++ program, with a GUI, into which I have embedded 
>>> python. I
>>> > have made several python functions in C++, one of which I use to
>>> > override the normal stdout and stderr so that they print to a text 
>>> box
>>> > of my GUI. One thing I cannot think of how to do is to redefine stdin
>>> > so that it pauses the program, waits for a user to type input into 
>>> the
>>> > box, hit enter, and takes input from another text element and 
>>> sends it
>>> > to python like it was the console.
>>>
>>> I suspect you don't really want to redirect stdin, but instead 
>>> implement
>>> raw_input(). [...]Try changing __builtins__.raw_input  to reference 
>>> your new
>>> function.
>>
>> But what would the function do? How would it pause python and wait for
>> it to have text to send?
>
> Whatever you want. You don't have to "pause python", Python itself 
> won't resume until your function doesn't return. (You should release 
> the GIL if your C++ function doesn't call back to Python code, to 
> allow other threads to continue, but that's another story).
> This is a raw_input replacement written in Tkinter; it shows a dialog 
> box instead of reading from stdin:
>
> py> from Tkinter import *
> py> from tkSimpleDialog import askstring
> py> def my_raw_input(prompt):
> ...   return askstring("Python", prompt)
> ...
> py> root = Tk()
> py> import __builtin__
> py> __builtin__.raw_input = my_raw_input
> py>
> py> raw_input("What's your name?")
> 'Gabriel'
>
>
> ------------------------------------------------------------------------
>
I think I see the OP's problem.  He has written a GUI program in C++, 
and is using (embedding) Python functions into it.  So presumably those 
functions are being called from events in the C++ event loop.

If one of those functions tries to call back into C++ code, the event 
loop will never get control, to process the events from the standard UI 
controls.

So if the input is to be handled as an integral part of the C++ UI, 
there's a distinct problem.

On the other hand, Gabriel's dialog box should work fine, as long as you 
don' t mind a modal dialog box as a solution.  I don't know tkinter's 
askstring, but I suspect it'd work.  However, the rest of the C++ GUI 
would be frozen, which could be a problem.

DaveA




More information about the Python-list mailing list