2009-05-01 9 views
11

Ich mache in Python eine Art wissenschaftliches Labor, in dem der Benutzer alle Arten von Objekten erstellen, ändern und analysieren kann. Ich möchte eine Python-Shell in das Programm einfügen, damit der Benutzer die Objekte durch die Shell manipulieren kann. (Anmerkung: Er kann die Objekte auch durch die übliche GUI manipulieren.)Einbetten einer Python-Shell in ein Python-Programm

Ein Mockup, die dies veranschaulicht: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

Wie kann ich so etwas machen?

Ich dachte über die Verwendung eval, aber ich habe verstanden, dass eval nicht mit import umgehen kann, zum Beispiel.

Antwort

10

Je nach GUI-Framework, das bereits getan kann ist:

  • Für wxpython, nachschlagen "PyCrust" - es ist sehr einfach in Ihre Anwendung
  • Für PyQt, pyqtshell (aktualisieren einzubetten 29.04.2011: in diesen Tagen genannt spyder)

Hier ist, was ich tat PyCrust in die Anwendung einbetten:

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

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

Die self bezieht sich hier auf meinen Hauptrahmen (abgeleitet von wx.Frame). Dies erstellt ein PyCrust-Fenster, das in Ihrer Anwendung ausgeführt wird und Ihnen erlaubt, alles zu überprüfen, das in Ihrem Hauptrahmen gespeichert wird (wegen der self).

+0

Ich schaute PyCrust auf, aber ich verstehe nicht- Erzeugt es eine andere Instanz von Python?Ich brauche etwas, das dieselbe Python-Instanz steuert, in der das Hauptprogramm ausgeführt wird. –

+0

Codebeispiel hinzugefügt. Es wird in derselben Instanz ausgeführt und kann auf das Objekt zugreifen und es ändern, das als übergeordnetes Objekt angegeben ist. –

+0

Danke, hat super funktioniert! –

3

Die Python eval() Funktion behandelt nur Ausdrücke. Sie können stattdessen die exec-Anweisung in Betracht ziehen, die beliebigen beliebigen Python-Code ausführen kann.

15

Sie suchen nach code - Interpreter base classes, insbesondere code.interact().

Einige examples from effbot.

+0

Diese Beispiele sind von Python 1.5 ... –

+0

Nun, der Link zu Docs ist 2.6 und alles, was Sie tun müssen, ist code.interact() aufrufen. Ein weiteres Beispiel ist ein Link zum Shellbefehl Django, der sowohl aktuell ist als auch mit IronPython funktioniert: http://code.djangoproject.com/browser/django/trunk/django/core/management/commands/shell.py –

+0

.. das ist nur als Referenz für andere Leute, die einen Dolmetscher einbetten müssen. Wenn Sie wxPython verwenden, ist PyCrust definitiv eine bessere Lösung. –

3

FWIW, ich glaube, Enthought hat so etwas für die Verwendung mit ihrer Python-basierten (und NumPy-basierten) Visualisierungssuite geschrieben. Vor zwei Jahren habe ich eine Demo gesehen, bei der man Objekte direkt über die GUI oder den Python-Interpreter manipulieren kann.

Um die erste Antwort hinzuzufügen, müssen Sie möglicherweise code.InteractiveConsole von der Klasse subclass ableiten, um self.read() und self.write() zu überschreiben, damit sie mit der GUI interagieren. Außerdem müssen Sie sys.stdout und sys.stderr in eine schreibbare Klasse umleiten, die in dieselbe Konsole schreibt.

+0

Bevor ich anfange, deine Antwort zu verdauen - Bist du zufällig zufällig Guido? –

0

Ich benutze pdb.set_trace() als eine Shell. Es hat auch einige Debugging-Fähigkeiten :)

Verwandte Themen