Внедрение оболочки Python внутри программы Python

Я делаю своего рода научную лабораторию на Python, в которой пользователь может создавать, изменять и анализировать всевозможные объекты. Я хотел бы поместить оболочку Python внутри программы, чтобы пользователь мог манипулировать объектами через оболочку. (Примечание: он также может манипулировать объектами через обычный графический интерфейс.)

Макет, который иллюстрирует это: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

Как я могу это сделать?

Я рассмотрел использование eval, но я понял, что eval не может обрабатывать import, например.

Ответ 1

В зависимости от вашей инфраструктуры графического интерфейса это уже возможно:

  • Для 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).

Ответ 3

Функция Python eval() обрабатывает только выражения. Вместо этого вы можете рассмотреть exec, который может запускать любой произвольный код Python.

Ответ 4

FWIW, я считаю, что Enthought написал что-то вроде этого для использования с их набором для визуализации на основе Python (и на основе NumPy). Я видел демо два года назад, где они действительно позволяли вам манипулировать объектами напрямую через графический интерфейс или через интерпретатор Python.

Кроме того, чтобы добавить к первому ответу, вам может потребоваться подкласс code.InteractiveConsole для переопределения self.read() и self.write(), поэтому они взаимодействуют с графическим интерфейсом. И вам также придется перенаправить sys.stdout и sys.stderr на некоторый класс, доступный для записи, который записывает на ту же консоль.

Ответ 5

Я использую pdb.set_trace() как оболочку. Он также имеет некоторые возможности для отладки:)