Velocity Reviews

Velocity Reviews (http://www.velocityreviews.com/forums/index.php)
-   Python (http://www.velocityreviews.com/forums/f43-python.html)
-   -   stdin in embedded python (http://www.velocityreviews.com/forums/t703757-stdin-in-embedded-python.html)

KillSwitch 11-01-2009 07:37 AM

stdin in embedded python
 
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 wonder if anyone could help me in trying to do such a thing. To
simplify, the new stdin should wait for the C++ function to give it a
value, like it waits for the console.

Dave Angel 11-01-2009 01:34 PM

Re: stdin in embedded python
 
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 wonder if anyone could help me in trying to do such a thing. To
> simplify, the new stdin should wait for the C++ function to give it a
> value, like it waits for the console.
>
>

I suspect you don't really want to redirect stdin, but instead implement
raw_input(). If you have control over the script, just change it from
raw_input() to cpp_raw_input(). But if you need to be able to run
arbitrary scripts, ...

(untried) - Try changing __builtins__.raw_input to reference your new
function.

DaveA


KillSwitch 11-01-2009 04:34 PM

Re: stdin in embedded python
 
On Nov 1, 5:34*am, Dave Angel <da...@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 wonder if anyone could help me in trying to do such a thing. To
> > simplify, the new stdin should wait for the C++ function to give it a
> > value, like it waits for the console.

>
> I suspect you don't really want to redirect stdin, but instead implement
> raw_input(). *If you have control over the script, just change it from
> raw_input() to cpp_raw_input(). *But if *you need to be able to run
> arbitrary scripts, ...
>
> (untried) - Try changing __builtins__.raw_input *to reference your new
> function.
>
> DaveA


But what would the function do? How would it pause python and wait for
it to have text to send?

Dave Angel 11-02-2009 02:13 AM

Re: stdin in embedded python
 
Gabriel Genellina wrote:
> En Sun, 01 Nov 2009 13:34:44 -0300, KillSwitch
> <gu.yakahughes@gmail.com> escribió:
>> On Nov 1, 5:34 am, Dave Angel <da...@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


Gabriel Genellina 11-02-2009 06:20 AM

Re: stdin in embedded python
 
En Sun, 01 Nov 2009 23:13:10 -0300, Dave Angel <davea@ieee.org> escribió:
> Gabriel Genellina wrote:
>> En Sun, 01 Nov 2009 13:34:44 -0300, KillSwitch
>> <gu.yakahughes@gmail.com> escribió:
>>> On Nov 1, 5:34 am, Dave Angel <da...@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().
>>>
>>> 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. [example using
>> Tkinter.askstring]
>>

> 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.


Perhaps looking a other examples may help. Both IDLE and PythonWin replace
raw_input with a message box; IDLE is a Tkinter application, and PythonWin
wraps MFC. Both have a main message loop and use a modal message box.

--
Gabriel Genellina



All times are GMT. The time now is 03:17 PM.

Powered by vBulletin®. Copyright ©2000 - 2014, vBulletin Solutions, Inc.
SEO by vBSEO ©2010, Crawlability, Inc.