最可靠方法是终端运行jupyter nbconvert --to python notebook.ipynb,官方支持、无损可复现:代码cell直转,markdown cell转注释;漏--to python会默认输出html,路径须正确,加--no-output --strip-metadata可生成干净脚本。

用 jupyter nbconvert 命令最可靠
直接在终端运行 jupyter nbconvert --to python notebook.ipynb 就能生成同名的 .py 文件。它会把每个 cell 按顺序转成 Python 代码,Markdown cell 转成注释,代码 cell 直接保留——这是官方支持、无损、可复现的方式。
常见错误是漏掉 --to python 参数,只写 jupyter nbconvert notebook.ipynb,默认输出的是 HTML,不是 Python 文件。
- 路径要写对:如果 notebook 不在当前目录,需补全相对或绝对路径,比如
jupyter nbconvert ./src/explore.ipynb - 想指定输出目录?加
--output-dir ./scripts,但注意目标目录必须已存在 - 不想保留 Markdown 注释?加
--no-prompt可去掉 In/Out 提示,但注释本身仍保留(这是设计行为,不是 bug)
.ipynb 里有魔法命令(%matplotlib inline 等)怎么办
这些命令在纯 Python 环境里会报 NameError: name 'get_ipython' is not defined。因为 nbconvert 不做运行时模拟,只是文本转换。
解决方法不是删掉它们,而是用条件包裹:
if 'get_ipython' in globals():
get_ipython().run_line_magic('matplotlib', 'inline')
或者更稳妥地判断环境:
import sys
if 'ipykernel' in sys.modules:
import matplotlib.pyplot as plt
plt.ion() # 或 plt.rcParams['interactive'] = True
- 别手动删
%行——下次再从 notebook 修改后重导出又得重复处理 -
%%time、%%writefile这类 cell magic 在 .py 里完全无效,建议只保留在 notebook 中用于开发调试
保存时自动清理输出和元数据(推荐日常使用)
带输出的 notebook 导出的 .py 虽然能用,但体积大、含冗余信息(比如 "metadata": {...}),且可能混入临时变量状态。
加两个参数就能干净导出:
jupyter nbconvert --to python --no-output --strip-metadata notebook.ipynb
-
--no-output:不保留任何执行结果(包括 print 输出、图表 base64、错误 traceback) -
--strip-metadata:清除所有 cell metadata(比如折叠状态、tags、slideshow 设置) - 这两个参数不影响代码逻辑,只影响可读性和文件大小,适合纳入脚本或 pre-commit 流程
VS Code 里点“另存为”生成的 .py 为什么常出问题
VS Code 的“Save As Python”本质是简单文本提取:它按 cell 顺序拼接代码,但会跳过空 cell、误切多行字符串、丢弃部分注释,也不处理富文本格式。尤其当 notebook 含 LaTeX、HTML table 或嵌套缩进 Markdown 时,生成的 .py 很可能语法错误或逻辑错位。
这不是 bug,是功能定位不同——VS Code 的导出是快速草稿用,不是生产级转换。
- 确认是否真需要 IDE 导出:除非你只要某几个 cell 的代码片段,否则优先用
nbconvert - 如果用了 VS Code 导出,务必用
python -m py_compile output.py检查语法,再跑一遍关键逻辑 - 某些插件(如 Jupyter Extension)更新后可能改变导出行为,建议固定用命令行方式保证一致性
真正麻烦的不是怎么导出,而是导出后要不要维护两份代码。多数情况下,.py 应该是 notebook 的“快照”,后续修改仍应在 notebook 中进行,再重新导出——否则很容易出现 .py 和 .ipynb 行为不一致的情况。











