2009-05-01 7 views
11

Estoy haciendo una especie de laboratorio de ciencias en Python, en el que el usuario puede crear, modificar y analizar todo tipo de objetos. Me gustaría poner un shell de Python dentro del programa, para que el usuario pueda manipular los objetos a través del shell. (Nota: También puede manipular los objetos a través de la interfaz gráfica de usuario habitual.)Incrustar un shell de Python dentro de un programa de Python

Una maqueta que ilustra esto: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

¿Cómo puedo hacer este tipo de cosas?

Consideré usar eval, pero entendí que eval no puede manejar import, por ejemplo.

Respuesta

10

Dependiendo de su marco de interfaz gráfica de usuario, es posible que ya se ha hecho:

  • Para wxpython, mirar hacia arriba "PyCrust" - es muy fácil de integrar en su aplicación
  • Para PyQt, pyqtshell (actualización 29.04.2011: estos días llamados spyder)

Esto es lo que hice para incrustar PyCrust en la aplicación:

import wx.py.crust 
... 
... 
# then call 

crustFrame = wx.py.crust.CrustFrame(parent = self) 
crustFrame.Show() 

El self aquí se refiere a mi marco principal (derivado de wx.Frame). Esto crea una ventana PyCrust que se ejecuta en su aplicación y le permite inspeccionar todo lo almacenado en su cuadro principal (debido al self).

+0

Busqué PyCrust, pero no entiendo: ¿crea otra instancia de Python?Necesito algo que controle la misma instancia de Python en la que se ejecuta el programa principal. –

+0

Ejemplo de código agregado. Se ejecuta en la misma instancia y puede acceder (y modificar) el objeto que se le da como padre. –

+0

¡Gracias, funcionó de maravilla! –

3

La función Python eval() solo maneja expresiones. Es posible que desee considerar la instrucción exec en su lugar, que puede ejecutar cualquier código Python arbitrario.

15

Está buscando code - Interpreter base classes, en particular code.interact().

Algunos examples from effbot.

+0

Esos ejemplos son de Python 1.5 ... –

+0

Bueno, el enlace a documentos es 2.6 y todo lo que necesita hacer es llamar a code.interact(). Para otro ejemplo, aquí hay un enlace al comando Django shell que es actual y también funciona con IronPython: http://code.djangoproject.com/browser/django/trunk/django/core/management/commands/shell.py –

+0

..es solo como referencia para otras personas que necesiten incrustar intérprete. Si está usando wxPython, PyCrust es definitivamente una mejor solución. –

3

FWIW, creo que Enthought ha escrito algo como esto para su uso con su suite de visualización basada en Python (y basada en NumPy). Vi una demostración hace dos años en la que te permiten manipular objetos directamente a través de la GUI o por medio del intérprete de Python.

Además, para agregar a la primera respuesta, es posible que deba crear una subclase de código. InteractiveConsole para reemplazar auto.read() y self.write(), de modo que interactúen con la GUI. Y también deberá redirigir sys.stdout y sys.stderr a alguna clase escribible que escriba en la misma consola.

+0

Antes de comenzar a digerir tu respuesta, ¿acaso, por casualidad, eres Guido? –

0

Utilizo pdb.set_trace() como shell. También tiene algunas capacidades de depuración :)

Cuestiones relacionadas