IPython手动迭代主循环?

gri*_*ako 5 python ipython

我可以以某种方式实例ipython(或甚至更好,ipython-qtconsole)并手动执行它的(IPython)主循环吗?

我想动态编辑panda3d程序.

EDIT1:这是代码示例,应该澄清一下我想做什么.

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()
Run Code Online (Sandbox Code Playgroud)

所以你可以看到我如何手动步入熊猫和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)
Run Code Online (Sandbox Code Playgroud)

在你的cmd行中,只需转到文件所在的目录即可

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

mes*_*iac 2

通过“即时编辑 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()
Run Code Online (Sandbox Code Playgroud)

使用if __name__ == "__main__"for 主循环,您的文件在独立运行时仍将正常工作。但现在您可以将其导入交互式会话并在步骤之间修改内容。

>>> import myfile
>>> app = myfile.MyApp()
>>> app.step()
>>> app.something = something_else
>>> app.step()
Run Code Online (Sandbox Code Playgroud)

现在将其添加到 IPython 的事件循环中,这样它将在您使用解释器时运行,您可以使用IPython.lib.inputhook.set_inputhook()(IPython 0.11 中的新增功能)。

>>> from IPython.lib import inputhook
>>> inputhook.set_inputhook(app.step)
Run Code Online (Sandbox Code Playgroud)

这应该会导致您的程序在解释器空闲时运行,但仍允许照常进行操作。