как встраивать ipython 0.12, чтобы он наследовал пространство имен вызывающей стороны? - PullRequest
4 голосов
/ 26 марта 2012

РЕДАКТИРОВАТЬ Я выделил реальный минимальный пример, который не работает (это часть более сложного кода);В конце концов, виновником является входная часть:

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

Что будет?

1 Ответ

2 голосов
/ 27 марта 2012

Проблема связана с этим вызовом к InteractiveShell.instance() в интеграции qt, когда вызывается до инициализации IPython.Если это вызывается до создания встроенной оболочки, некоторые предположения не выполняются.Исправление заключается в создании встроенного объекта оболочки сначала , тогда у вас не должно возникнуть никаких проблем.И вы можете получить тот же объект из любого места в вашем коде, просто вызвав InteractiveShellEmbed.instance().

Эта версия должна работать очень хорошо, создав экземпляр InteractiveShellEmbed first :

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...