如何使用我自己的横幅调用“IPython.start_ipython()”?

Leo*_*ael 6 python ipython

什么有效

调用 时IPython.embed(),可以通过banner1,banner2header来自定义交互式会话之前出现的消息,如下所示:

import IPython
IPython.embed(banner2="*** Welcome! ***")
Run Code Online (Sandbox Code Playgroud)

结果:

import IPython
IPython.embed(banner2="*** Welcome! ***")
Run Code Online (Sandbox Code Playgroud)

什么不起作用

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

我能做的最好的事情就是 mangle argv,更改配置,例如:

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

这是可用的,但看起来很做作。

我想我也可以在我的代码中继承IPython.ipapp.TerminalInteractiveShell并覆盖.banner1or .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)
)
Run Code Online (Sandbox Code Playgroud)

约束条件

更具体的用例是,该脚本是由buildouts自动生成的zc.recipe.egg,它IPython.start_ipython使用IPython [console_scripts]入口点进行定位,因此我实际可以传递到脚本中的自定义量受到限制,并且无法IPython.embed()直接使用。

超级骗子加上特定的用例是我实际上正在使用anybox.recipe.odoo,它包装了zc.recipe.egg. 最终结果是我对脚本的构建方式更加受限。

基本上我可以只设置传递给 call 的参数,IPython.start_ipython()就像 arguments使用 的选项一样zc.recipe.egg,没有其他的。特别是,我无法使用initialization的选项zc.recipe.egg

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

dtk*_*dtk 3

正如@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)
Run Code Online (Sandbox Code Playgroud)

结果:

$ 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]: 
Run Code Online (Sandbox Code Playgroud)

Ftr:Config构造函数接受kwargs

c = Config(TerminalInteractiveShell={'banner2': '*** Welcome! ***'})
Run Code Online (Sandbox Code Playgroud)

哈,dtk

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