调用 时IPython.embed(),可以通过banner1,banner2或header来自定义交互式会话之前出现的消息,如下所示:
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。
我宁愿不必编写自己的入口点。
正如@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.