如何用自己的横幅调用`IPython.start_ipython()`?

时间:2015-07-24 15:00:08

标签: python ipython

什么有效

调用IPython.embed()时,可以通过banner1banner2header来自定义在互动会话之前显示的消息,如下所示:

import IPython
IPython.embed(banner2="*** Welcome! ***")

结果:

Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
Type "copyright", "credits" or "license" for more information.

IPython 3.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

*** Welcome! ***
In [1]: 

什么不起作用

在上面的调用中使用IPython.start_ipython()而不是IPython.embed()时,我找不到任何会影响横幅的参数,除了display_banner=False以完全省略它。

我能做的最好是破坏argv,以改变配置,如:

import sys, IPython
argv = (
    sys.argv[1:] + 
    ['--TerminalInteractiveShell.banner2=*** Welcome! ***']
)
IPython.start_ipython(argv=argv)

这是可行的,但看起来很做人。

我想我也可以在我的代码中继承IPython.ipapp.TerminalInteractiveShell并覆盖.banner1.banner2,但这感觉有点矫枉过正。

问题

我想要的只是将banner2传递给IPython.start_ipython()的方法。

有更简单的方法吗?

更多技术细节

用例是创建一个脚本,该脚本使用一些预定义的变量启动IPython控制台会话,以便通过相当复杂的设置来控制应用程序。并解释如何使用设置。

类似的东西:

import sys, myapp, IPython

explain_usage_of_session = """
You can use session.blah() to frobnicate the foobaringo
"""

session = myapp.MyComplicatedSessionFactory(including=
    configuration.params(from_file))

sys.exit(
    IPython.start_ipython(user_ns=dict(session=session),
                          banner2=explain_usage_of_session)
)

约束

更具体的用例是buildout的{​​{1}}自动生成此脚本,zc.recipe.egg使用IPython.start_ipython IPython条目找到[console_scripts]点,所以我在实际上可以传入脚本的自定义数量有限,而且我不能直接使用IPython.embed()

超级duper加上特定用例是我实际上使用anybox.recipe.odoo,它包裹zc.recipe.egg。最终的结果是我对脚本的构建方式更加有限。

基本上我可以像IPython.start_ipython()的{​​{1}}选项一样设置传递到arguments调用的参数,而不是其他任何内容。特别是,我无法使用zc.recipe.egg的{​​{1}}选项。

我宁愿不必写自己的入口点。

1 个答案:

答案 0 :(得分:2)

正如@Thomas K所述,您可以创建IPython.Config个实例并设置banner2

from IPython import start_ipython
from traitlets.config.loader import Config

c = Config()
c.TerminalInteractiveShell.banner2 = '*** Welcome! ***'

start_ipython(config=c)

结果:

$ python start_with_banner.py
Python 2.7.11+ (default, Mar 30 2016, 21:00:42) 
Type "copyright", "credits" or "license" for more information.

IPython 2.4.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

*** Welcome! ***
In [1]: 

Ftr:Config构造函数接受kwargs

c = Config(TerminalInteractiveShell={'banner2': '*** Welcome! ***'})

H个, DTK

更新:对于ipython 5.x之前的版本,您可以直接from IPython import Config