在 Windows 上使用 bpython
解决思路
提示: 如需看 “解决流程”, 请直接跳到下一个章节.
windows 用户直接运行 bpython, 会遇到很多 “ModuleNotFound” 错误.
根据官方的 解决方法, 我们需要手动下载 curses 库 (一个 whl 文件), 然后在终端使用 bpython-curses
启动.
考虑到官方的这个建议已经比较老了, (大概在 7 年前提出的?) 现在我们要解决 curses 的问题其实有更好的方法: 通过 pip install windows-curses
一步到位.
另一个问题才是我们关心的, 那就是 bpython-curses
命令在最新版 (v0.22.1) 中会报错:
ModuleNotFoundError: No module named 'fcntl'
(有些人报的错误是 "No module named 'termios'")
我根据报错回溯看了下 bpython 的源代码, 比较让人无语的是, 原来它是 bpython 在初始化导入时不小心使用了 curtsies 相关的导入语句造成的.
这个问题打个比方就像是, 官方告诉 windows 用户有一个水坑跳过去就可以了, 结果官方自己演示的时候先踩了水坑才起跳, 这就导致本可以避免的报错发生了.
解决起来也比较简单, 将 bpython 中的 config.py 和 args.py 中的部分代码行注释掉就行了. 详见下个章节的操作.
解决流程
-
安装 bpython
pip install bpython
-
安装 windows-curses
pip install windows-curses
-
来到
<python 安装目录>/Lib/site-packages/bpython/
目录下:(本人演示的是 bpython v0.22.1 的情况.)
-
找到 “config.py”
将第 38 行注释掉, 然后在第 372 行插入一句 “from .curtsiesfrontend.parse import CNAMES”:
... # from .curtsiesfrontend.parse import CNAMES # <- 第 38 行注释掉 ... def load_theme( path: Path, colors: MutableMapping[str, str], default_colors: Mapping[str, str], ) -> None: from .curtsiesfrontend.parse import CNAMES # <- 第 372 行插入这行代码 ...
-
找到 “args.py”
将第 35 行, 第 209 ~ 213 行注释掉:
... # import curtsies # <- 第 35 行 ... def parse( args: Optional[List[str]], extras: Options = None, ignore_stdin: bool = False, ) -> Tuple: ... # logger.info(f"curtsies: {curtsies.__version__}") # <- 第 209 行 # logger.info(f"cwcwidth: {cwcwidth.__version__}") # <- 第 210 行 # logger.info(f"greenlet: {greenlet.__version__}") # <- 第 211 行 # logger.info(f"pygments: {pygments.__version__}") # <- 第 212 行 # logger.info(f"requests: {requests.__version__}") # <- 第 213 行 ... ...
-
-
现在在 cmd 中重新输入
bpython-curses
, 可以成功运行了:
参考链接
按推荐程度降序.
- https://github.com/bpython/bpython/issues/509#issuecomment-860573706
- https://blog.csdn.net/weixin_39876002/article/details/109869107
- https://docs.bpython-interpreter.org/en/latest/windows.html
- https://github.com/bpython/bpython/issues/509
- https://stackoverflow.com/review/suggested-edits/18134290
- https://github.com/veeso/termiWin