在Python程序中嵌入Python shell

时间:2009-05-01 22:31:42

标签: python shell

我在Python中创建了一个科学实验室,用户可以在其中创建,修改和分析各种对象。我想在程序中放置一个Python shell,因此用户可以通过shell操作对象。 (注意:他也可以通过常用的GUI操作对象。)

一个说明这个的模型: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

我怎样才能做出这类事情?

我考虑过使用eval,但我知道eval无法处理import,例如。

5 个答案:

答案 0 :(得分:15)

您正在寻找code - Interpreter base classes,特别是code.interact()。

一些examples from effbot

答案 1 :(得分:10)

根据您的GUI框架,它可能已经完成:

  • 对于wxpython,查找“PyCrust” - 它很容易嵌入到你的应用程序中
  • 对于PyQt,pyqtshell更新29.04.2011:这些天称为spyder

以下是我将PyCrust嵌入到应用程序中所做的工作:

import wx.py.crust
...
...
# then call

crustFrame = wx.py.crust.CrustFrame(parent = self)
crustFrame.Show()

此处self指的是我的主框架(源自wx.Frame)。这将创建一个在您的应用程序中运行的PyCrust窗口,允许您检查存储在主框架中的所有内容(由于self)。

答案 2 :(得分:3)

Python eval()函数只处理表达式。您可能需要考虑exec语句,它可以运行任意Python代码。

答案 3 :(得分:3)

FWIW,我相信Enthought已经编写了类似这样的东西,用于基于Python(和基于NumPy)的可视化套件。两年前我看过一个演示,它确实让你直接通过GUI或Python解释器来操作对象。

另外,要添加第一个答案,您可能必须将code.InteractiveConsole子类化为覆盖self.read()和self.write(),以便它们与GUI交互。而且你还必须将sys.stdout和sys.stderr重定向到写入同一控制台的可写类。

答案 4 :(得分:0)

我使用pdb.set_trace()作为shell。它还具有一些调试功能:)