在Python程序中嵌入Python shell

11

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

下面是一个说明此功能的模型: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

我该如何做到这种效果?

我曾考虑使用 eval,但我了解到eval不能处理import等操作。

5个回答

15

好的,文档链接是2.6版本,你只需要调用code.interact()即可。另一个例子,这里有一个链接到Django shell命令的页面,它既是最新的,也可以与IronPython一起使用:http://code.djangoproject.com/browser/django/trunk/django/core/management/commands/shell.py - Van Gale
如果您需要嵌入解释器,那么这只是供其他人参考的。如果您正在使用wxPython,则PyCrust绝对是更好的解决方案。 - Van Gale

9

根据您使用的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)。

我查了一下PyCrust,但是我不明白它是否会创建另一个Python实例?我需要的是能够控制与主程序运行在同一实例中的Python的工具。 - Ram Rachum
添加了代码示例。它在同一实例中运行,并且可以访问(并修改)作为其父级给出的对象。 - Eli Bendersky
pyqtshell被重命名为pydee,pydee又被重命名为spyder。 - 9b5b

3

就我所知,Enthought为其基于Python(和NumPy)的可视化套件编写了类似的东西。两年前,我看到了一个演示,他们确实让您通过GUI或Python解释器直接操作对象。

此外,补充第一个答案,您可能需要子类化code.InteractiveConsole以覆盖self.read()和self.write(),以便它们与GUI交互。您还需要将sys.stdout和sys.stderr重定向到一些可写类,以便将其写入同一控制台。


在我开始消化你的回答之前,你碰巧是Guido吗? - Ram Rachum

2

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接