想法来历
为什么想要利用脚本来进行代码的自动化运行?是因为在做机器学习仿真的时候,因为需要对不同的参数组合的情况进行多次仿真,而一次仿真时间又很长,3个小时起步,调参的效率就很低。因此想着如果能够实现自动化更换参数,就可以一晚上跑好几种情况的仿真了,这将很大程度加速我的进程。
Windows系统
命名为auto.bat
@echo off
setlocal EnableDelayedExpansion
rem 激活虚拟环境
call D:\ProgramData\Anaconda3\condabin\conda.bat activate qz1
rem 设置Python解释器路径
set PYTHON_EXEC=python
rem 设置脚本路径
set SCRIPT_PATH=E:\你的路径\my_code.py
rem 从文件读取参数
set PARAM_FILE=E:\你的路径\params.txt
rem 清空控制台
cls
rem 遍历参数文件中的每一行
for /f "tokens=1,2,3,4 delims=," %%a in (%PARAM_FILE%) do (
echo Running: %PYTHON_EXEC% %SCRIPT_PATH% %%a %%b %%c %%d
%PYTHON_EXEC% %SCRIPT_PATH% %%a %%b %%c %%d
if !errorlevel! neq 0 (
echo Error occurred with parameters %%a %%b %%c %%d
)
)
rem 退出虚拟环境
call conda deactivate
endlocal
pause
代码解释
- 激活虚拟环境:
call %VENV_PATH%\Scripts\activate
激活指定路径的虚拟环境。
- 设置脚本路径:
set SCRIPT_PATH=E:\你的路径\my_code.py
设置要运行的Python脚本路径。
- 嵌套循环:
- 使用嵌套 for 循环遍历所有参数组合,并运行Python脚本。
echo Running: %PYTHON_EXEC% %SCRIPT_PATH% %%a %%b %%c %%d
输出当前运行的命令,便于调试。
%PYTHON_EXEC% %SCRIPT_PATH% %%a %%b %%c %%d
运行Python脚本,并传递当前组合的参数。
deactivate
用于退出虚拟环境。和pause
在批处理脚本结束时查看输出。
参数文件params.txt
20,5,80,fullbit
20,5,80,incremental
20,5,80,FedDQ
每一行四个参数,对应了上面读取的四个参数%%a %%b %%c %%d
,如果想自己修改参数的熟练,可以增加更多的%%e %%f
表示更多的参数。
运行脚本
以下是上面提到的my_code.py
def my_fun(param_1, param_2, param_3, param_4):
print(f"params is {param_1} {param_2} {param_3} {param_4}")
if __name__ == "__main__":
my_fun()
最后,在文件系统中双击auto.bat
,即可运行:
Linux Shell
以下是上面脚本的等效Linux环境版
#!/bin/bash
set -e # 确保发生错误时退出
# 激活虚拟环境
source /path/to/anaconda3/bin/activate qz1 # 修改为你的 Anaconda 安装路径和虚拟环境名
# 设置Python解释器路径
PYTHON_EXEC=python
# 设置脚本路径
SCRIPT_PATH=E:\你的路径\my_code.py # 修改为你的 Python 脚本路径
# 从文件读取参数
PARAM_FILE=E:\你的路径\params.txt # 修改为你的参数文件路径
# 清空控制台
clear
# 遍历参数文件中的每一行
while IFS=, read -r param1 param2 param3 param4; do
echo "Running: $PYTHON_EXEC $SCRIPT_PATH $param1 $param2 $param3 $param4"
$PYTHON_EXEC "$SCRIPT_PATH" "$param1" "$param2" "$param3" "$param4" || {
echo "Error occurred with parameters $param1 $param2 $param3 $param4"
}
done < "$PARAM_FILE"
# 退出虚拟环境
conda deactivate
遍历参数文件:
while IFS=, read -r param1 param2 param3 param4; do
:使用while
循环读取文件中的每一行参数。IFS=,
设置内部字段分隔符为逗号。read -r param1 param2 param3 param4
读取每行中的四个参数。- 使用
"$param1
、"$param2
、"$param3
、"$param4
来安全地处理带空格的参数。
修改脚本路径和参数文件路径
确保将 /path/to/anaconda3/bin/activate
和 E:\你的路径
替换为你的实际路径。我的是:
source /home/user/anaconda3/bin/activate qz1
SCRIPT_PATH=/home/user/projects/my_code.py
PARAM_FILE=/home/user/projects/params.txt
使用方法
- 将脚本保存为
run_simulations.sh
- 使用命令添加脚本权限
chmod +x run_simulations.sh
- 运行
./run_simulations.sh