jupyter nbconvert --to script 是最可靠通用的转换方式,官方推荐、稳定可批量,保留代码与注释,但 display、魔力命令等 ipython 特性在 python 环境中不兼容。

jupyter nbconvert --to script 是最可靠、最通用的转换方式,其他方法要么受限于 GUI 环境,要么绕过核心逻辑容易丢代码或注释。
用 jupyter nbconvert --to script 命令行转换
这是官方推荐、稳定且可批量处理的方式,依赖 nbconvert(Jupyter 自带,一般无需额外安装)。
- 确保当前终端已进入
.ipynb所在目录,否则路径错误会导致“File not found” - 执行:
jupyter nbconvert --to script your_notebook.ipynb,生成同名.py文件 - 若要批量转换当前目录所有 notebook:
jupyter nbconvert --to script *.ipynb(Windows PowerShell 需写成Get-ChildItem *.ipynb | ForEach-Object { jupyter nbconvert --to script $_.Name }) - 输出路径默认与输入文件相同;如需指定目录,加
--output-dir ./scripts/ - 注意:命令中
--to script和--to python效果一致,但前者是当前文档标准写法,后者在新版中已被标记为 deprecated
在 Jupyter Notebook 界面里点选导出
适合单次、快速、不记命令的场景,但只适用于已打开的 notebook,且无法控制输出位置或批量操作。
- 打开 notebook 后,点击顶部菜单
File→Download as→Python (.py) - 浏览器会直接下载,文件名与 notebook 标题一致(不是文件名),比如 notebook 标题是 “EDA Report”,下载的是
EDA Report.py,即使原文件叫analysis.ipynb - 该方式会保留所有 code cell 的内容,但 markdown cell 会被转成
#开头的注释,且不保留执行序号(如In [1]:) - 如果 notebook 里用了
IPython.display或widgets,这些调用会保留在.py中,但运行时会报错——因为纯 Python 环境不支持这些交互式对象
用 Python 脚本调用 nbconvert API
适合集成进 CI/CD、自动化流水线或需要自定义处理逻辑的场景,比 shell 调用更可控。
- 不要手写 JSON 解析(如直接读
.ipynb并提取source),那样会丢失 metadata、cell 类型判断和编码细节 - 正确做法是调用 nbconvert 的 Python 接口:
from nbconvert import ScriptExporter,然后 load notebook、export、写入文件 - 示例关键片段:
exporter = ScriptExporter() (body, resources) = exporter.from_filename("notebook.ipynb") with open("notebook.py", "w", encoding="utf-8") as f: f.write(body) - 这种方式能复用 nbconvert 的全部逻辑(比如跳过 raw cell、处理 encoding、注入 shebang),但要求环境里有完整 Jupyter 安装,不能只靠
nbformat
哪些内容一定会丢失或出问题
转换不是“复制粘贴”,而是结构映射,以下几类内容在 .py 中天然不兼容:
-
display()、HTML()、Markdown()等 IPython 特有函数——运行时报NameError - 魔力命令(
%matplotlib inline、%%time)会被转成普通注释,不再生效 - 富输出(如 pandas DataFrame 表格、plotly 交互图)只保留生成代码,不保留渲染结果
- notebook 的 kernel 信息、执行历史(
execution_count)、metadata(如widgets状态)全部丢弃 - 中文路径或含空格的文件名,在 Windows 下用命令行时务必用英文引号包裹:
jupyter nbconvert --to script "实验数据分析.ipynb"
plt.show()、把魔力命令替换成等效 setup 代码。这才是转换后最常卡住的地方。











