关于 Jupyter Console 没有自动提示 (补全) 的修复

news/2024/10/17 22:30:11/

现象描述

在命令行中通过 jupyter console 进入控制台, 发现输入命令时, 不会自动弹出提示. 比如:

a = 1  # 我在第一行输入了 `a = 1`
a  # 当输入第一个字母 "a" 时, 按理来说应该弹出补全提示 " = 1", 但是没有

解决方法

该操作需要修改 jupyter-console 的源文件:

  1. 源文件位于: {site-packages}/jupyter_console/ptshell.py

  2. 在第 47 行插入以下内容:

    from prompt_toolkit.auto_suggest import AutoSuggestFromHistory  # <--- HERE
    

    示意图:

    ...
    from prompt_toolkit import __version__ as ptk_version
    PTK3 = ptk_version.startswith('3.')if not PTK3:# use_ayncio_event_loop obsolete in PKT3from prompt_toolkit.eventloop.defaults import use_asyncio_event_loopfrom prompt_toolkit.auto_suggest import AutoSuggestFromHistory  # <--- HERE
    from prompt_toolkit.completion import Completer, Completion
    from prompt_toolkit.document import Document
    from prompt_toolkit.enums import DEFAULT_BUFFER, EditingMode
    ...
    
  3. 在第 559 行插入以下内容:

    auto_suggest=AutoSuggestFromHistory(),  # <--------------------------- HERE
    

    示意图:

    ...
    # Tell prompt_toolkit to use the asyncio event loop.
    # Obsolete in prompt_toolkit.v3
    if not PTK3:use_asyncio_event_loop()self.pt_cli = PromptSession(auto_suggest=AutoSuggestFromHistory(),  # <----------------------- HEREmessage=(lambda: PygmentsTokens(self.get_prompt_tokens())),multiline=True,complete_style=self.pt_complete_style,editing_mode=editing_mode,lexer=PygmentsLexer(get_pygments_lexer(lexer)),prompt_continuation=(lambda width, lineno, is_soft_wrap: PygmentsTokens(self.get_continuation_tokens(width))),...
    )
    ...
    

即可解决.

测试一下效果

该测试场景模拟了 A 窗口启动了 ipython 内核服务, B 窗口使用 jupyter console 连接该服务, 并获得完美的自动补全功能.

# test/ipython_service.py
from IPython import embed_kerneldef hello():print('hello world')embed_kernel(user_ns={'a'    : 'alpha','b'    : 'beta','hello': hello,
})

打开一个命令行, 作为 A 窗口, 输入以下命令:

python test/ipython_service.py
# 控制台出现打印信息: 
#   to connect another client to this kernel, use:
#       --existing kernel-12345.json

再新开一个命令行, 作为 B 窗口, 输入以下命令:

jupyter console --existing 12345

尝试输入以下命令, 可以观察到自动补全的效果:

a, b
a + b  # 当输入 "a" 时, 会提示 ", b"
a, b, hello()  # 当输入 "a" 时, 会提示 " + b"; 继续输入 "a,", 会转为提示 " b"
...exit()
#   exit(keep_kernel=False)  # 断开 B 且停止 A. (默认)
#   exit(keep_kernel=True)  # 断开 B 但不停止 A.

附录: 研究过程

prompt-toolkit 是一个 python 库, 用来给命令行 REPL 提供上下文感知, 自动补全, 历史记录等功能. 它是 ipython 和 jupyter 的重要依赖之一.

jupyter consoleipython 都会启动命令行界面, 但二者在体验上存在一些不同之处, 其中最显著的就是前者没有自动补全, 而后者有, 因此使用体验受到影响. 好在本文就是为了解决这个问题的.

观察 jupyter console -h 的参数, 有一个 --no-simple-prompt, 是用来启用 prompt-toolkit 的功能的.

按理来说 jupyter console 提供这个参数, 就应该能够使用自动补全功能, 但本人测试最新版 (截至 2023-07-01) 并没有作用, 个人怀疑是 jupyter 的一个 bug.

此外, 根据官方文档描述, 启动 jupyter console 的命令行界面后, 使用下面的命令也能激活自动补全功能:

通过阅读 jupyter_console 的源代码, 发现 jupyter_console/ptshell.py 文件确实少了 prompt_toolkit.auto_suggest.AutoSuggestFromHistory, 所以问题就好解决了, 把它作为参数传到 ZMQTerminalInteractiveShell.pt_cli 的实例化构造中即可.


http://www.ppmy.cn/news/755089.html

相关文章

涨知识了!原来删除微信朋友圈内容这么简单,4种方法轻松解决

微信是使用人数最多的社交APP之一&#xff0c;相信大家的微信好友基本上都是七大姑八大姨、同学、朋友等认识的人。 不过人总有年少轻狂的时候&#xff0c;到现在回看那些朋友圈内容&#xff0c;总是让自己有点不好意思。今天笔者教大家如何清理朋友圈的内容&#xff0c;下面就…

微信小程序-仿微信朋友圈

微信小程序-仿微信朋友圈 作者&#xff1a;秋名 撰写时间&#xff1a;2020 年05 月05日 技术要点&#xff1a;使用微信云开发&#xff0c;实现模拟微信发布动态&#xff0c;上传多张图片&#xff0c;上拉刷新&#xff0c;下拉懒加载。 动态圈JS // pages/list/list.js const…

微信iOS版朋友圈可删除评论;周鸿祎:有的软件会偷拍偷录;银河麒麟操作系统V10发布| 极客头条

整理 | 屠敏 头图 | CSDN 下载自东方 IC 「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 国内要闻 华为&#xff1a;会继续向预装 Google Play 的手…

一键清空朋友圈软件_微信清理朋友圈app下载-微信清理朋友圈下载v1.8.0 安卓版-西西软件下载...

微信清理朋友圈app一款强大的微信清理工具,当你想要重置自己的微信号并删除所有的内容之时,又觉得一条条删太麻烦了,就可以用到这款神器工具,可以帮助你一键删除掉朋友圈内的所有内容,帮助你轻松的重置微信号,十分的方便&#xff01;赶快下载微信清理朋友圈app开始体验吧&#…

【openGauss数据库】--运维指南03--数据导出

【openGauss数据库】--运维指南03--数据导出 &#x1f53b; 一、openGauss导出数据&#x1f530; 1.1 概述&#x1f530; 1.2 导出单个数据库&#x1f537; 1.2.1 导出数据库&#x1f537; 1.2.2 导出模式&#x1f537; 1.2.3 导出表 &#x1f530; 1.3 导出所有数据库&#x1…

微信朋友圈设计原理

转自&#xff1a;http://www.woshipm.com/pd/2701264.html 当你一秒钟拍了张自拍&#xff0c;一个小时修了下图&#xff0c;然后打开朋友圈&#xff0c;点击发送的那一刻&#xff0c;后台到底有多少工作在进行着&#xff1f; 我们太习以为常&#xff0c;没有意识到这背后还会…

2019一键清空朋友圈_批量清理朋友圈说说

2019微信怎批量删除朋友圈 2019微信一键清空朋方法对于微信一键清空朋友法很多人复杂的一条条的删除&#xff0c;是批量也是难以全选&#xff0c;微信很多时候都没有那么全面&#xff0c;主要是害怕一些人一不小心点着什么就全部清空了&#xff0c;为了防止这样的第且能够很多功…

还在为微信朋友圈的大量广告而苦恼吗?一文教你如何清除微信朋友圈的广告!!!

还在为微信朋友圈的大量广告而苦恼吗&#xff1f;一文教你如何清除微信朋友圈的广告&#xff01;&#xff01;&#xff01; 大家好&#xff0c;我叫亓官劼&#xff08;q guān ji &#xff09;&#xff0c;在CSDN中记录学习的点滴历程&#xff0c;时光荏苒&#xff0c;未来可期…