如何用单脚本按序运行依赖不同Conda环境的Jupyter Notebook?
按序运行对应Anaconda环境的Jupyter Notebook脚本方案
完全可以通过单脚本实现按序运行所有Notebook并匹配对应环境,以下是具体实现步骤和示例:
核心逻辑
借助Anaconda的conda run命令直接在指定环境中执行任务,搭配jupyter nbconvert工具运行Notebook,按顺序处理每个文件,确保前一个Notebook生成的CSV输出就绪后再启动下一个。
具体实现
1. 整理环境与Notebook对应关系
先把每个Notebook和对应的Anaconda环境按执行顺序列出来,比如:
notebook1.ipynb→env_notebook1notebook2.ipynb→env_notebook2- ...
notebook10.ipynb→env_notebook10
2. 编写批量运行脚本
根据操作系统选择对应的脚本:
Linux/macOS Shell脚本
#!/bin/bash # 按顺序定义Notebook和对应环境,格式为"文件名:环境名" declare -a tasks=( "notebook1.ipynb:env_notebook1" "notebook2.ipynb:env_notebook2" "notebook3.ipynb:env_notebook3" # 补充剩余7个Notebook和环境的对应关系 ) for task in "${tasks[@]}"; do # 拆分文件名和环境名 IFS=":" read -r nb_file env_name <<< "$task" echo "=== 开始运行 $nb_file (环境: $env_name) ===" # 在指定环境中执行Notebook,覆盖原文件保存执行结果 conda run -n "$env_name" jupyter nbconvert --to notebook --execute "$nb_file" --inplace # 检查运行是否成功,失败则终止流程 if [ $? -ne 0 ]; then echo "❌ $nb_file 运行失败,终止全部流程" exit 1 fi echo "✅ $nb_file 运行完成" done echo "🎉 所有Notebook已按序执行完毕"
Windows 批处理脚本
@echo off setlocal enabledelayedexpansion :: 按顺序定义Notebook和对应环境,用分号分隔,格式为"文件名:环境名" set "tasks=notebook1.ipynb:env_notebook1;notebook2.ipynb:env_notebook2;notebook3.ipynb:env_notebook3" for %%t in (%tasks%) do ( set "current_task=%%t" :: 拆分文件名和环境名 for /f "tokens=1,2 delims=:" %%a in ("!current_task!") do ( echo === 开始运行 %%a (环境: %%b) === conda run -n %%b jupyter nbconvert --to notebook --execute %%a --inplace :: 检查运行状态 if errorlevel 1 ( echo ❌ %%a 运行失败,终止全部流程 exit /b 1 ) echo ✅ %%a 运行完成 ) ) echo 🎉 所有Notebook已按序执行完毕
关键细节
conda run -n <环境名>:无需手动激活环境,直接在指定环境中执行后续命令,避免环境切换的麻烦。jupyter nbconvert --execute:执行Notebook中的所有代码,--inplace会将执行结果覆盖原Notebook,也可以用--output <新文件名>保存执行后的版本。- 错误检查:每个Notebook运行失败时脚本会立即终止,防止后续依赖错误的Notebook无效执行。
- CSV路径:确保所有Notebook读取和写入CSV的路径一致,且脚本运行用户拥有该路径的读写权限。
内容的提问来源于stack exchange,提问作者cb_coder
相关产品推荐
相关产品推荐

