利用shell脚本实现python代码自动化运行(windows、Linux)

想法来历

为什么想要利用脚本来进行代码的自动化运行?是因为在做机器学习仿真的时候,因为需要对不同的参数组合的情况进行多次仿真,而一次仿真时间又很长,3个小时起步,调参的效率就很低。因此想着如果能够实现自动化更换参数,就可以一晚上跑好几种情况的仿真了,这将很大程度加速我的进程。

Windows系统

命名为auto.bat

powershell 复制代码
@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

代码解释

  1. 激活虚拟环境:
  • call %VENV_PATH%\Scripts\activate 激活指定路径的虚拟环境。
  1. 设置脚本路径:
  • set SCRIPT_PATH=E:\你的路径\my_code.py 设置要运行的Python脚本路径。
  1. 嵌套循环:
  • 使用嵌套 for 循环遍历所有参数组合,并运行Python脚本。
  • echo Running: %PYTHON_EXEC% %SCRIPT_PATH% %%a %%b %%c %%d 输出当前运行的命令,便于调试。
    %PYTHON_EXEC% %SCRIPT_PATH% %%a %%b %%c %%d 运行Python脚本,并传递当前组合的参数。
  1. deactivate 用于退出虚拟环境。和 pause 在批处理脚本结束时查看输出。

参数文件params.txt

powershell 复制代码
20,5,80,fullbit
20,5,80,incremental
20,5,80,FedDQ

每一行四个参数,对应了上面读取的四个参数%%a %%b %%c %%d,如果想自己修改参数的熟练,可以增加更多的%%e %%f表示更多的参数。

运行脚本

以下是上面提到的my_code.py

python 复制代码
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环境版

bash 复制代码
#!/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/activateE:\你的路径 替换为你的实际路径。我的是:

bash 复制代码
source /home/user/anaconda3/bin/activate qz1
SCRIPT_PATH=/home/user/projects/my_code.py
PARAM_FILE=/home/user/projects/params.txt

使用方法

  1. 将脚本保存为 run_simulations.sh
  2. 使用命令添加脚本权限chmod +x run_simulations.sh
  3. 运行 ./run_simulations.sh
相关推荐
正义的彬彬侠4 分钟前
CatBoost 中对分类特征进行目标变量统计编码 公式解析
人工智能·机器学习·集成学习·boosting·catboost
字节跳动数据平台8 分钟前
火山引擎 VeDI 平台以 AIGC 技术,助力企业提效营销、快速增长
人工智能
赛丽曼10 分钟前
Python中的TCP
python
小白~小黑11 分钟前
软件测试基础二十(接口测试 Postman)
python·自动化·postman
codists12 分钟前
《Django 5 By Example》阅读笔记:p76-p104
python·django·编程人
湖南罗泽南13 分钟前
Windows C++ TCP/IP 两台电脑上互相传输字符串数据
c++·windows·tcp/ip
欧阳枫落20 分钟前
python 2小时学会八股文-数据结构
开发语言·数据结构·python
Chef_Chen23 分钟前
从0开始学习机器学习--Day22--优化总结以及误差作业(上)
人工智能·学习·机器学习
天天要nx24 分钟前
D64【python 接口自动化学习】- python基础之数据库
数据库·python
小奥超人27 分钟前
PPT技巧:如何合并PPT文件?
windows·经验分享·microsoft·powerpoint·办公技巧