我正在用Python制作一种科学实验室,用户可以创建,修改和分析各种对象。我想在程序中放置一个Python shell,以便用户可以通过shell操作对象。(注意:他也可以通过常规GUI操作对象。)
下面是一个说明此功能的模型: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif
我该如何做到这种效果?
我曾考虑使用 eval
,但我了解到eval
不能处理import
等操作。
我正在用Python制作一种科学实验室,用户可以创建,修改和分析各种对象。我想在程序中放置一个Python shell,以便用户可以通过shell操作对象。(注意:他也可以通过常规GUI操作对象。)
下面是一个说明此功能的模型: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif
我该如何做到这种效果?
我曾考虑使用 eval
,但我了解到eval
不能处理import
等操作。
您正在寻找代码 - 解释器基类,特别是code.interact()。
一些来自effbot的示例。
根据您使用的GUI框架,可能已经完成了此项工作:
spyder
)这是我将PyCrust嵌入应用程序所做的内容:
import wx.py.crust
...
...
# then call
crustFrame = wx.py.crust.CrustFrame(parent = self)
crustFrame.Show()
self
指的是我的主框架(派生自wx.Frame
)。这将创建一个PyCrust窗口,运行在你的应用程序中,并允许你检查存储在主框架中的所有内容(因为有self
)。就我所知,Enthought为其基于Python(和NumPy)的可视化套件编写了类似的东西。两年前,我看到了一个演示,他们确实让您通过GUI或Python解释器直接操作对象。
此外,补充第一个答案,您可能需要子类化code.InteractiveConsole以覆盖self.read()和self.write(),以便它们与GUI交互。您还需要将sys.stdout和sys.stderr重定向到一些可写类,以便将其写入同一控制台。
我使用pdb.set_trace()作为一个shell。它还具有一些调试功能 :)