Внедрение оболочки 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
).
Ответ 2
Вы ищете code - базовые классы интерпретатора, в частности code.interact().
Некоторые примеры из effbot.
Ответ 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() как оболочку. Он также имеет некоторые возможности для отладки:)