The Python eval()
function only handles expressions. You may want to consider the exec
statement instead, which can run any arbitrary Python code.
You are looking for code - Interpreter base classes, particularly code.interact().
Some examples from effbot.
FWIW, I believe Enthought has written something like this for use with their Python-based (and NumPy-based) visualization suite. I saw a demo two years ago where they indeed let you manipulate objects directly via the GUI or via the Python interpreter.
Also, to add to the first answer, you might have to subclass code.InteractiveConsole to override self.read() and self.write(), so they interact with the GUI. And you'll also have to redirect sys.stdout and sys.stderr to some writable class that writes to the same console.
Depending on your GUI framework, it may already has been done:
- For wxpython, look up "PyCrust" - it's very easy to embed into your app
- For PyQt, pyqtshell
Here's what I did to embed PyCrust into the application:
import wx.py.crust
...
...
# then call
crustFrame = wx.py.crust.CrustFrame(parent = self)
crustFrame.Show()
The self
here refers to my main frame (derived from wx.Frame
). This creates a PyCrust window that runs in your application and allows you to inspect everything stored in your main frame (because of the self
).