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脚本运行


    1. 将run_training_models.sh放到1.training_models.py相同的目录下
    1. 使用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 环境下被正确处理

    1. 运行chmod +x run_training_models.sh 命令赋予运行该文件的权限
    • chmod是 “change mode” 的缩写,它是 Linux、Unix 等类 Unix 系统中用于更改文件或目录权限的命令。

    • +x是命令的一个选项参数,在这里它表示加上可执行权限(“x” 代表可执行权限,与之对应的还有 “r” 表示可读权限,“s” 表示特殊权限等)。

    • 注意:当使用bash命令运行.sh脚本时,不需要脚本文件具有可执行权限。这是因为bash命令本身会读取脚本文件的内容,并按照bash语法来解释和执行其中的命令。它直接将脚本文件作为输入传递给bash解释器,而不是像执行可执行文件那样依赖文件本身的权限设置来运行

    1. 运行执行脚本命令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 文件里,这样所有相关的输出信息都可以统一在一个文件中进行查看和分析。最后的 & 符号用于将命令放到后台运行










posted @ 2024-12-03 16:39  卡卡发  阅读(11)  评论(0编辑  收藏  举报