在 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”: ...
...
def load_theme(
path: Path,
colors: MutableMapping[str, str],
default_colors: Mapping[str, str],
) -> None:
from .curtsiesfrontend.parse import CNAMES
...
-
找到 “args.py” 将第 35 行, 第 209 ~ 213 行注释掉: ...
...
def parse(
args: Optional[List[str]],
extras: Options = None,
ignore_stdin: bool = False,
) -> Tuple:
...
...
...
-
现在在 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
|