2009-05-01 6 views
11

私はPythonで一種の科学実験室を作っています。そこでは、あらゆる種類のオブジェクトを作成、修正、分析できます。私はプログラムの中にPythonシェルを入れたいので、ユーザーはシェルを通してオブジェクトを操作することができます。 (注:彼はまた、通常のGUIを通じてオブジェクトを操作することができます。)Pythonプログラムの中にPythonシェルを埋め込む

これを示しモックアップ: http://cool-rr.com/physicsthing/physicsthing_mockup_thumb.gif

どのように私はこの種のものを作ることができますか?

私はevalを使用すると考えましたが、evalは、例えばimportを処理できません。

答えて

10

あなたのGUIフレームワークによっては、それが既に行われていることがあります。

  • をwxPythonのために、「PyCrust」を調べる - それはPyQtはのためのアプリ
  • に埋め込むことは非常に簡単です、pyqtshell更新2011年4月29日:spyderと呼ばれるこれらの日)

は、ここで私は、アプリケーションにPyCrustを埋め込むためにやったことだ:

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

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

selfは(wx.Frame由来)私のメインフレームを指します。これにより、アプリケーションで実行されるPyCrustウィンドウが作成され、(selfのために)メインフレームに格納されているすべてを検査することができます。

+0

私はPyCrustを調べましたが、わかりません - Pythonの別のインスタンスが作成されていますか?私は、メインプログラムが実行されているPythonの同じインスタンスを制御するものが必要です。 –

+0

コードサンプルを追加しました。同じインスタンスで実行され、親として与えられたオブジェクトにアクセス(および変更)できます。 –

+0

ありがとう、素晴らしい仕事! –

3

Pythonのeval()関数は式だけを処理します。代わりに任意のPythonコードを実行できるexecステートメントを考慮する必要があります。

15

あなたが特にcode.interact、code - Interpreter base classesを探しています()。

一部examples from effbot

+0

これらの例はPython 1.5からです... –

+0

さて、docsへのリンクは2.6であり、あなたがする必要があるのはcode.interact()です。別の例として、Djangoシェルコマンドへのリンクがあります。このコマンドは現在もIronPythonでも動作しています:http://code.djangoproject.com/browser/django/trunk/django/core/management/commands/shell.py –

+0

..それは単に通訳を埋め込む必要がある他の人々のための参考用です。 wxPythonを使用している場合、PyCrustはより良い解決策です。 –

3

FWIW、私はEnthoughtが自分のPythonベース(とnumpyのベース)の可視化スイートを使用するため、このような何かを書かれたと考えられます。私は2年前にデモを見ました。GUIやPythonインタプリタを介してオブジェクトを直接操作することができました。

また、最初の答えに追加するには、(self.readを上書きするcode.InteractiveConsoleをサブクラス化する必要がある場合があります)とself.write()ので、彼らはGUIと対話します。また、sys.stdoutとsys.stderrを同じコンソールに書き込む書き込み可能なクラスにリダイレクトする必要があります。

+0

私はあなたの答えを消化する前に、あなたは何とかGuidoになるのですか? –

0

私はシェルとしてpdb.set_trace()を使用します。それはまた、いくつかのデバッグ機能を持っています:)

関連する問題