IPython повторяет основной цикл вручную? - PullRequest
5 голосов
/ 11 августа 2011

Могу ли я как-нибудь создать экземпляр ipython (или, что еще лучше, ipython-qtconsole) и выполнить его основной цикл (IPython) вручную?

Я хочу редактировать программы panda3d на лету.

РЕДАКТИРОВАТЬ1: Вот пример кода, который должен немного прояснить, что я хочу сделать.

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from direct.showbase.ShowBase import ShowBase

class MyApp(ShowBase):

    def __init__(self):
        ShowBase.__init__(self)
        self.qtApp = QApplication(sys.argv)
        label = QLabel("Hello World")
        label.show()
        self.m = loader.loadModel("frowney")
        self.m.reparentTo(render)

        while 1:
            self.qtApp.processEvents()  #manual step trough Qt loop
            taskMgr.step()              #manual step trough Panda3D loop

app = MyApp()

Итак, вы можете увидеть, как я могу вручную пройти через panda и qt, я хочу сделать то же самое с ipython, если это возможно.

ОТВЕТ Полный файл:

from direct.showbase.ShowBase import ShowBase
from IPython.lib import inputhook
class MyApp(ShowBase):

def __init__(self):
    ShowBase.__init__(self)
    self.m = loader.loadModel("frowney")
    self.m.reparentTo(render)

def stepMe(self):
    taskMgr.step()              #manual step trough Panda3D loop
    return 0  
if __name__ == "__main__":  
    app = MyApp()  
    inputhook.set_inputhook(app.stepMe)

В строке cmd просто перейдите в каталог, где находится файл, и выполните

  1. ipython
  2. run file.py
  3. app.m.setPos(1,1,1)

Ответы [ 2 ]

2 голосов
/ 16 августа 2011

Под «редактированием программ panda3d на лету» вы имеете в виду изменение вещей для проверки работающей программы?Или действительно вносить постоянные изменения в структуру вашей программы в интерактивной среде?

Просто перешагнуть цикл в интерактивном сеансе Python довольно легко.Вы можете просто заменить while 1: объявлением метода, таким как def step(self):, а затем вызывать его для каждого шага.

import sys

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from direct.showbase.ShowBase import ShowBase

class MyApp(ShowBase):

    def __init__(self):
        ShowBase.__init__(self)
        self.qtApp = QApplication(sys.argv)
        label = QLabel("Hello World")
        label.show()
        self.m = loader.loadModel("frowney")
        self.m.reparentTo(render)

    def step(self):
        self.qtApp.processEvents()  #manual step trough Qt loop
        taskMgr.step()              #manual step trough Panda3D loop
        return 0                    #PyOS_InputHook expects an integer

if __name__ == "__main__":
    app = MyApp()
    while 1: app.step()

С if __name__ == "__main__" для основного цикла, ваш файл все равно будет работать как следуеткогда запустить автономно.Но теперь вы можете импортировать его в интерактивный сеанс и изменять вещи между шагами.

>>> import myfile
>>> app = myfile.MyApp()
>>> app.step()
>>> app.something = something_else
>>> app.step()

Теперь, чтобы добавить его в цикл событий IPython, чтобы он запускался при использовании интерпретатора, вы можете использовать IPython.lib.inputhook.set_inputhook() (новое в IPython 0.11).

>>> from IPython.lib import inputhook
>>> inputhook.set_inputhook(app.step)

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

1 голос
/ 14 августа 2011

Запустите сценарий в отладчике ipython, используя

%run -d -b40 myscript

Параметр -b40 устанавливает точку останова в сценарии в строке 40 (которая должна быть первой строкой цикла, который вы хотите отладить).Введите c в командной строке, чтобы запустить сценарий, который остановится на точке останова.Введите h, чтобы получить помощь по отладчику.

...