在Python程序中嵌入Python shell

11 投票
5 回答
3369 浏览
提问于 2025-04-15 11:21

我正在用Python制作一个科学实验室的程序,用户可以在里面创建、修改和分析各种对象。我想在程序里放一个Python命令行,这样用户就可以通过这个命令行来操作这些对象。(注意:用户也可以通过普通的图形界面来操作对象。)

这里有个示意图,可以帮助理解这个想法:http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

我该怎么做才能实现这个功能呢?

我考虑过使用eval,但我了解到eval不能处理import这样的命令。

5 个回答

3

顺便说一下,我相信Enthought公司为他们基于Python和NumPy的可视化工具写过类似的东西。我两年前看过一个演示,确实可以通过图形界面或者Python解释器直接操作对象。

另外,补充一下第一个回答,你可能需要创建一个新的类来继承code.InteractiveConsole,以便重写self.read()和self.write(),让它们能够和图形界面互动。同时,你还需要把sys.stdout和sys.stderr重定向到一个可以写入的类,这样它们就能输出到同一个控制台了。

15

你在找的是 代码 - 解释器基础类,特别是 code.interact() 这个部分。

这里有一些来自 effbot 的例子

9

根据你使用的图形用户界面(GUI)框架,可能已经有现成的解决方案:

  • 如果你用的是wxpython,可以查一下“PyCrust”——它很容易嵌入到你的应用程序中。
  • 如果你用的是PyQt,可以看看pyqtshell更新于2011年4月29日:现在叫做spyder)。

这是我将PyCrust嵌入到应用程序中的做法:

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

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

这里的self指的是我的主窗口(它是从wx.Frame派生出来的)。这段代码创建了一个在你的应用程序中运行的PyCrust窗口,让你可以查看主窗口中存储的所有内容(因为有self的关系)。

撰写回答