2011-08-11 19 views
5

¿De alguna manera puedo instanciar ipython (o incluso mejor, ipython-qtconsole) y paso a través de su bucle principal (IPython) manualmente?¿IPython itera el bucle principal manualmente?

Quiero editar programas panda3d sobre la marcha.

EDIT1: Aquí hay un ejemplo de código que debería aclarar un poco lo que quiero hacer.

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() 

para que pueda ver cómo puedo entrar manualmente la panda canal y cuarto de galón, lo que quiero hacer lo mismo con ipython si su posible.

RESPUESTA archivo completo:

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) 

En su línea de cmd, sólo tiene que ir al directorio en el archivo es y hacer

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

Respuesta

2

Con "editar programas panda3d sobre la marcha", ¿solo se refiere a cambiar las cosas para probar el programa en ejecución? ¿O en realidad hacer ediciones persistentes en la estructura de su programa en el entorno interactivo?

Simplemente pasando por encima de su ciclo en una sesión interactiva de python es bastante fácil. Simplemente puede reemplazar while 1: con una declaración de método como def step(self):, luego llámelo para cada paso.

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() 

Con if __name__ == "__main__" para el bucle principal, el archivo seguirá funcionando como debería cuando se ejecuta independiente. Pero ahora puede importarlo en una sesión interactiva y modificar cosas entre pasos.

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

Ahora para añadirlo a bucle de eventos de IPython, por lo que se ejecutará cuando se utiliza el intérprete, puede utilizar IPython.lib.inputhook.set_inputhook() (nuevo en IPython 0,11).

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

Esto debería hacer que su programa se ejecute mientras el intérprete está inactivo, pero aún así permitir la manipulación como de costumbre.

+0

Lo siento, pero creo que no has notado _I_Python en el título y el cuerpo de la pregunta. O si lo hiciste, entonces quiero hacer algo como IPython.step() en ese ciclo while. – grizwako

+1

@GrizzLy Uso este método en el intérprete de Python estándar de vez en cuando, así que pensé que podría ser similar a lo que buscabas. Para ipython, ¿puede simplemente 'desde entrada de entrada de IPython.lib inputhook; inputhook.set_inputhook (app.step) '? Parece que debe hacer lo que quieras, y parece funcionar para una aplicación panda3d que tenía por ahí, siempre y cuando "paso" devuelva 0. – mesilliac

+0

disculpa por molestar, pero ¿podrías publicar instrucciones sobre cómo lograrlo? código, y los comandos que utiliza para ejecutarlo así? Lo intenté y no tuve suerte. – grizwako

1

ejecutar el script en el depurador ipython usando

%run -d -b40 myscript 

El parámetro -b40 establece un punto de interrupción en la secuencia de comandos en la línea 40 (que debería ser la primera línea del bucle que desea depurar). Escriba c en el indicador para iniciar el script que se detendrá en el punto de interrupción. Escriba h para obtener ayuda sobre el depurador.

+1

Sí, pero eso detendría la ejecución de mi juego, quiero que funcione de manera continua. – grizwako

+1

@Grizzly, ¿cómo podrías avanzar paso a paso en el ciclo y, al mismo tiempo, dejar que tu aplicación se ejecute si todo sucede dentro del mismo hilo? (o tal vez malinterpreté su pregunta) – MatToufoutu

+0

@Mat Mire el código que publiqué en cuestión, está en eso mientras que 1: parte.¿Tal vez entendí mal algo completamente, pero pasar a través del bucle significa hacer funcionar su aplicación? – grizwako