bash脚本 - 输入不同参数重复运行同一python脚本
一、bash脚本内容
run_training_models.sh
#!/bin/bash
python_script="1.training_models.py"
random_seed_list=( $(seq 1 10) )
for seed in "${random_seed_list[@]}"
do
actual_seed=$((42 * $seed))
while true # 这是一个无限循环(while true),目的是确保 Python 脚本能够成功运行
do
python3 $python_script $actual_seed > "1.training_models_${actual_seed}.log" 2>&1 &
pid=$! # 获取刚放到后台运行的命令的进程 ID
wait $pid # 等待该进程完成
if [ $? -eq 0 ]; then
break
else
echo "内存溢出或其他错误,重新运行,种子值为 $actual_seed"
fi
done
echo "已完成以种子值 $actual_seed 运行 $python_script"
done
echo "所有任务已完成运行"
解释:
-
seq 1 10会生成一个从 1 到 10 的数字序列,然后将这个序列赋值给random_seed_list数组,所以这个数组包含了 1、...、8、9、10 这10个元素。
-
通过if [ $? -eq 0 ]; then判断上一个命令(也就是等待的 Python 脚本执行进程)的退出状态码是否为 0(退出状态码为 0 表示命令成功执行),如果是,则使用break跳出内层的while循环,意味着这个种子值对应的 Python 脚本已经成功运行;如果不是 0(说明可能出现内存溢出或其他错误),则会输出提示信息echo "内存溢出或其他错误,重新运行,种子值为 $actual_seed",然后继续循环再次尝试运行 Python 脚本。
-
在1.training_models_${actual_seed}.log这个文件名中,如果不使用花括号,写成1.training_models_$actual_seed.log,Bash 可能会误解变量名。它可能会尝试将$actual作为一个变量,后面跟着_seed.log这样的固定字符串
对应的1.training_models.py中接收参数部分代码(便于理解):
print(f"START===================================train {name} for p&u=======================================")
if len(sys.argv) < 2:
print("无seed参数传入,退出程序")
sys.exit(1)
else:
try:
now_seed = int(sys.argv[1])
except ValueError:
print("命令行传入的种子值(seed)参数格式不正确,退出程序")
sys.exit(1)
structures, targets = get_low_fidelity_dataset(name)
model = training_model(structures, targets, name, now_seed)
print(f"END===================================train {name} for p&u=======================================")
解释:
-
sys.argv,它是 Python 中用于获取命令行参数的列表(数组),sys.argv[0]通常是脚本自身的名称,而从sys.argv[1]开始才是真正传递给脚本的参数。
-
这里sys.argv[0]为1.training_models.py;sys.argv[1]为参数actual_seed
-
通过sys.exit(1)来终止程序运行,并且返回状态码 1,表示程序是由于缺少必要参数而异常退出
二、bash脚本运行
-
- 将run_training_models.sh放到1.training_models.py相同的目录下
-
- 使用dos2unix工具将win版本的run_training_models.sh转换成linux版本的bash文件
-
dos2unix是一个用于转换文件格式的工具,主要用于将 DOS/Windows 格式的文本文件转换为 Unix/Linux 格式
-
在 DOS/Windows 系统中,文本文件的行结束符是回车符(\r)和换行符(\n),即\r\n;而在 Unix/Linux 系统中,行结束符仅为换行符(\n)。dos2unix工具会将文件中的\r\n替换为\n,使得文件能在 Unix/Linux 环境下被正确处理
-
- 运行
chmod +x run_training_models.sh
命令赋予运行该文件的权限
-
chmod
是 “change mode” 的缩写,它是 Linux、Unix 等类 Unix 系统中用于更改文件或目录权限的命令。 -
+x
是命令的一个选项参数,在这里它表示加上可执行权限(“x” 代表可执行权限,与之对应的还有 “r” 表示可读权限,“s” 表示特殊权限等)。 -
注意:当使用bash命令运行.sh脚本时,不需要脚本文件具有可执行权限。这是因为bash命令本身会读取脚本文件的内容,并按照bash语法来解释和执行其中的命令。它直接将脚本文件作为输入传递给bash解释器,而不是像执行可执行文件那样依赖文件本身的权限设置来运行
- 运行
-
- 运行执行脚本命令
nohup bash run_training_models.sh > train_bash.log 2>&1 &
-
nohup 是 “no hang up” 的缩写,用于在 Unix/Linux 系统中运行命令时,使得该命令不受终端会话挂断(比如用户退出终端、网络连接断开等情况)的影响,能够继续在后台运行。通常用于执行一些耗时较长的任务,这样即使终端关闭了,任务依然可以正常进行下去。
-
>
是输出重定向符号,它的作用是将前面命令(也就是 bash run_training_models.sh)的标准输出(通常是命令执行过程中打印到屏幕上的正常信息,比如一些打印语句输出的内容等)重定向到指定的文件中。 -
2>&1 & 部分中: Unix/Linux 系统中,文件描述符 0 通常代表标准输入,1 代表标准输出,2 代表标准错误输出。2>&1 表示将标准错误输出(文件描述符 2)重定向到标准输出(文件描述符 1)所指向的地方。这里的意思是不仅把脚本执行的标准输出保存到 train_bash.log 文件中,也把标准错误输出(比如脚本执行过程中出现的报错信息等)同样保存到 train_bash.log 文件里,这样所有相关的输出信息都可以统一在一个文件中进行查看和分析。最后的 & 符号用于将命令放到后台运行
- 运行执行脚本命令