如何在传递自定义user_ns和横幅时启动ipython应用程序实例?

时间:2013-08-19 16:05:17

标签: python ipython

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

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

我已经提出了以下解决方案,但它有点像一个hacky kludge。还有更好的方法吗?

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()

1 个答案:

答案 0 :(得分:3)

使用新的IPython 1.0版本,有一个顶级IPython.start_ipython()函数来启动应用程序。这正是你想要的,但不幸的是我们已经下滑了1.0,并且将user_ns传递到它当前没有任何效果。我们可能会在几周内发布一个错误修正版本,然后鼓励人们尽可能开始使用新功能。