2012-03-26 9 views
4

EDIT実際の最小限の例は動作しません(より複雑なコードの一部です)。犯人は、すべての後にinputhookの一部です:ipython 0.12を埋め込み、呼び出し元の名前空間を継承する方法は?

def foo(): 
    exec 'a=123' in globals() 
    from IPython.frontend.terminal.embed import InteractiveShellEmbed 
    ipshell=InteractiveShellEmbed() 
    ipshell() 

# without inputhook, 'a' is found just fine 
import IPython.lib.inputhook 
IPython.lib.inputhook.enable_gui(gui='qt4') 

foo() 

は0.12で実行:

In [1]: a 
--------------------------------------------------------------------------- 
NameError         Traceback (most recent call last) 
/tmp/<ipython-input-1-60b725f10c9c> in <module>() 
----> 1 a 

NameError: name 'a' is not defined 

周りの方法だろうか?

+0

それは開発版で動作しているようです - 多分修正されました0.12のバグがありました。 –

+0

@ThomasK:私は例を複雑にして、実際にそれを非機能にする必要がありました。これはqt4 inputhookに関連しています。以前は0.11で正常に動作していました。 – eudoxos

答えて

2

問題は、Qt統合でthis callInteractiveShell.instance()が原因で発生します。これは、IPythonが初期化される前に呼び出されたときです。組み込みシェルを作成する前にこれを呼び出すと、いくつかの前提が満たされません。この問題を解決するには、埋め込みシェルオブジェクトを最初にに作成してください。問題がないはずです。 InteractiveShellEmbed.instance()を呼び出すだけで、コード内の他の場所から同じオブジェクトを取得することができます。

このバージョンでは、InteractiveShellEmbedインスタンスに最初を作成することによって、うまく動作するはずです:

from IPython.frontend.terminal.embed import InteractiveShellEmbed 
# create ipshell *before* calling enable_gui 
# it is important that you use instance(), instead of the class 
# constructor, so that it creates the global InteractiveShell singleton 
ipshell = InteractiveShellEmbed.instance() 

import IPython.lib.inputhook 
IPython.lib.inputhook.enable_gui(gui='tk') 

def foo(): 
    # without inputhook, 'a' is found just fine 
    exec 'a=123' in globals() 
    # all calls to instance() will always return the same object 
    ipshell = InteractiveShellEmbed.instance() 
    ipshell() 

foo() 
+0

非常に良い。私はもう一つの問題を発見しました。私は 'from yade import *'を使ってより大きなパッケージをインポートしています。これを行うと(シェルインスタンスの作成の前か後かに関係なく)、エラーが再び発生します( 'a'は定義されていません)。これは内部的に 'PyEval_InitThreads'と他のものの束を呼び出します。干渉が起こる可能性はありますか? – eudoxos

+0

OK、問題は循環インポートやそれに類するものと関連しているようです。今すぐうまく動作します。 – eudoxos

+0

@minrk IPythonシェルを起動するときにも '' user_ns''オプションを使うことができますか? – hosolmaz

関連する問題