Встраивание оболочки Python в программу Python - PullRequest
11 голосов
/ 02 мая 2009

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

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

Как я могу делать такие вещи?

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

Ответы [ 5 ]

15 голосов
/ 02 мая 2009

Вы ищете код - базовые классы интерпретатора , в частности code.interact ().

Несколько примеров из effbot .

10 голосов
/ 02 мая 2009

В зависимости от вашей структуры 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).

3 голосов
/ 02 мая 2009

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

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

3 голосов
/ 02 мая 2009

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

0 голосов
/ 19 марта 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...