请求按字母顺序批量运行目录及子目录下的Jupyter Notebook并展示执行过程
请求按字母顺序批量运行目录及子目录下的Jupyter Notebook并展示执行过程
我完全懂你手动维护%run命令的痛苦——文件夹层级一多,简直是重复劳动的噩梦!下面给你一个实用的Python自动化脚本方案,完美满足你的所有需求:按字母顺序递归遍历所有子文件夹、串行执行Notebook(保证依赖顺序)、实时打印执行的文件路径,还能处理执行异常。
解决方案步骤
1. 核心思路
用Jupyter官方的nbconvert工具来批量执行Notebook,配合Python的文件遍历功能,实现递归查找、排序、串行执行的完整流程。nbconvert比手动用%run更稳定,适合自动化场景。
2. 完整脚本代码
创建一个名为run_all_notebooks.py的文件,把下面的代码复制进去:
import os import subprocess def run_notebooks_in_order(root_dir): # 递归收集所有.ipynb文件,排除临时检查点文件 notebook_paths = [] for dirpath, _, filenames in os.walk(root_dir): for filename in filenames: if filename.endswith('.ipynb') and not filename.startswith('.ipynb_checkpoints'): full_path = os.path.join(dirpath, filename) notebook_paths.append(full_path) # 按字母顺序排序文件路径 notebook_paths.sort() # 逐个串行执行Notebook for idx, nb_path in enumerate(notebook_paths, 1): print(f"=== 正在执行第 {idx}/{len(notebook_paths)} 个Notebook: {nb_path} ===") try: # 使用nbconvert执行Notebook,执行后覆盖原文件(可按需修改输出方式) result = subprocess.run( [ "jupyter", "nbconvert", "--execute", "--inplace", "--ExecutePreprocessor.timeout=-1", # 取消超时限制,按需调整为具体秒数 nb_path ], capture_output=True, text=True ) # 处理执行结果 if result.returncode != 0: print(f"❌ 执行失败: {nb_path}") print("错误日志:") print(result.stderr) break # 若需继续执行后续Notebook,将break改为continue else: print(f"✅ 执行成功: {nb_path}\n") except Exception as e: print(f"❌ 执行出错: {nb_path}") print(f"异常信息: {str(e)}\n") break if __name__ == "__main__": # 替换为你的目标根目录路径,比如 "./my_notebooks" 或绝对路径 target_root = "./" run_notebooks_in_order(target_root)
3. 脚本关键细节说明
- 递归收集文件:
os.walk会自动遍历根目录下所有子文件夹,同时过滤掉Jupyter生成的临时检查点文件,避免执行无效内容。 - 严格字母排序:
notebook_paths.sort()会按照文件路径的字母顺序排序,完全符合你要求的执行顺序。 - 实时执行反馈:每执行一个Notebook都会打印当前进度、文件路径,成功/失败状态一目了然,方便你跟踪流程。
- 异常处理:如果某个Notebook执行失败,脚本会打印详细错误日志,你可以选择停止执行或继续(修改
break为continue即可)。 - 超时控制:
--ExecutePreprocessor.timeout=-1取消了执行超时限制,适合运行时间较长的Notebook;如果需要限制时长,把-1改成具体秒数即可。
4. 使用方法
- 把脚本放在你的目标根目录下(或者修改
target_root为你的根目录绝对路径)。 - 打开终端,进入脚本所在目录,运行命令:
python run_all_notebooks.py - 之后就能实时看到每个Notebook的执行进度和状态了!
额外注意事项
- 依赖路径问题:确保Notebook里读取输入文件的路径是正确的——优先用绝对路径,或者相对于根目录的相对路径,避免因执行目录变化导致找不到文件。
- 自定义执行顺序:如果你的Notebook依赖关系不是严格按字母顺序,可在收集文件后手动调整排序逻辑(比如给依赖前置的文件加前缀,或者自定义排序规则)。
- 保留原文件:脚本用了
--inplace参数,执行后会覆盖原Notebook的输出;若要保留原文件,把--inplace改成--output=执行后的文件名.ipynb即可。
备注:内容来源于stack exchange,提问作者josepmaria
相关产品推荐
相关产品推荐

