3

我正在尝试修复烧瓶脚本中的错误。Django 曾经有过类似的错误,一位 IPython 开发人员建议使用 TerminalIPythonApp 而不是 embed() 以便可以正确加载扩展。但是,django shell 不允许像烧瓶脚本那样自定义横幅或命名空间。

user_ns 和banner 通常传递给shell 的构造函数,但是TerminalIPythonApp 类实例化它自己的shell 而不暴露任何可能允许我们传递shell 初始化参数的kwarg。

我想出了以下解决方案,但是它有点笨拙。有没有更好的办法?

from IPython.terminal import ipapp
app = ipapp.TerminalIPythonApp.instance()
shell = ipapp.TerminalInteractiveShell.instance(
    parent=app,
    display_banner=False,
    profile_dir=app.profile_dir,
    ipython_dir=app.ipython_dir,
    user_ns=my_user_ns,
    banner1=my_banner)
shell.configurables.append(app)
app.shell = shell
# shell has already been initialized, so we have to monkeypatch
# app.init_shell() to act as no-op
app.init_shell = lambda: None
app.initialize(argv=[])
app.start()
4

1 回答 1

3

在新的 IPython 1.0 版本中,有一个顶级IPython.start_ipython()函数来启动应用程序。这正是您想要的,但不幸的是,我们在 1.0 版本中出现了问题,user_ns目前传入它没有任何效果。我们可能会在几周内发布错误修复版本,然后鼓励人们尽可能开始使用新功能。

于 2013-08-20T22:04:53.960 回答