2009-05-01 2 views
11

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

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

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

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

ответ

10

В зависимости от вашей структуры графического интерфейса пользователя, он может уже было сделано:

  • Для WxPython, посмотрите вверх "PyCrust" - это очень легко встроить в приложение
  • Для PyQt, pyqtshell (Update 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).

+0

Я посмотрел на PyCrust, но я не понимаю. Создает ли он еще один экземпляр Python?Мне нужно что-то, что будет контролировать тот же экземпляр Python, что и основная программа. –

+0

Добавлен образец кода. Он работает в том же экземпляре и может получить доступ (и изменить) объект, которому дано это как родитель. –

+0

Спасибо, отлично поработал! –

3

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

15

Вы ищете code - Interpreter base classes, в частности code.interact().

examples from effbot.

+0

Эти примеры взяты из Python 1.5 ... –

+0

Ну, ссылка на документы - 2.6, и все, что вам нужно сделать, это вызвать код.interact(). Для другого примера, вот ссылка на команду оболочки Django, которая является текущей, а также работает с IronPython: http://code.djangoproject.com/browser/django/trunk/django/core/management/commands/shell.py –

+0

.. это просто для справки для других людей, которым требуется встроить интерпретатор. Если вы используете wxPython, то PyCrust определенно является лучшим решением. –

3

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

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

+0

Прежде, чем я начну переваривать ваш ответ - Вы случайно, возможно, будете Гвидо? –

0

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

Смежные вопросы