如何在Jupyter Notebook内自动导出无输出的.py版本用于版本控制
在Jupyter Notebook内自动导出无输出.py版本用于版本控制
如果你想在Notebook内部自动导出不含输出的.py文件(方便版本控制),可以用以下两种方案:
方案一:用IPython魔法命令快速执行
直接在代码单元格里通过!前缀调用jupyter nbconvert命令,搭配清除输出的参数即可:
步骤1:自动获取当前Notebook文件名
不用手动输入文件名,用这段代码自动获取:
from IPython.display import Javascript import os def get_notebook_name(): display(Javascript('IPython.notebook.kernel.execute("notebook_name = " + "\'"+IPython.notebook.notebook_path+"\'");')) try: return os.path.basename(notebook_name) except NameError: return "请重新运行此单元格获取文件名" notebook_file = get_notebook_name()
步骤2:执行导出命令
运行下面的命令,生成无输出的.py文件:
!jupyter nbconvert --to python --ClearOutputPreprocessor.enabled=True {notebook_file}
执行后会生成和原Notebook同名的.py文件,里面只有代码和注释,所有输出内容都会被清除。
方案二:用Python subprocess模块定制导出
如果需要指定导出目录、捕获执行状态等定制化操作,用subprocess模块更灵活:
import subprocess import os from IPython.display import Javascript # 获取当前Notebook文件名 def get_notebook_name(): display(Javascript('IPython.notebook.kernel.execute("notebook_name = " + "\'"+IPython.notebook.notebook_path+"\'");')) try: return os.path.basename(notebook_name) except NameError: raise Exception("无法获取Notebook文件名,请重新运行此单元格") notebook_file = get_notebook_name() # 自定义导出目录,可根据需求修改 output_dir = "./version_control" # 自动创建导出目录(不存在时) os.makedirs(output_dir, exist_ok=True) # 构建导出命令 export_cmd = [ "jupyter", "nbconvert", "--to", "python", "--ClearOutputPreprocessor.enabled=True", "--output-dir", output_dir, notebook_file ] # 执行命令并捕获结果 run_result = subprocess.run(export_cmd, capture_output=True, text=True) # 反馈执行状态 if run_result.returncode == 0: py_file_path = os.path.join(output_dir, os.path.splitext(notebook_file)[0] + ".py") print(f"导出成功!无输出.py文件路径:{py_file_path}") else: print(f"导出失败,错误信息:{run_result.stderr}")
注意事项
--ClearOutputPreprocessor.enabled=True是核心参数,确保导出的.py文件不含任何Notebook输出,完全适配Git等版本控制系统。- 可以把导出代码放在Notebook的最后一个单元格,每次运行完Notebook后执行,自动完成导出操作。
内容的提问来源于stack exchange,提问作者Kouichi C. Nakamura
相关产品推荐
相关产品推荐

