二分脚本-自己使用

# bin_check.py

dict_test = {1: 'fail', 2: 'fail', 3: 'fail', 4: 'fail', 5: 'fail', 6: 'fail', 7: 'pass', 8: 'pass', 9: 'pass',
             10: 'pass'}


def bin_check(dict_test: dict, mid):
    if int(dict_test[mid]) > 10:
        return "pass"
    else:
        return "fail"
    print(dict_test.get[mid])


# 从 a.txt 读取参数,转成字典的格式
# with open('a.txt', 'r') as file:
#     param_list = [line.strip() for line in file]
#
# my_dict = {idx: value for idx, value in enumerate(param_list)}
case_name = 'a.txt'


def change_type(case_name):
    with open(case_name, 'r') as file:
        param_list = [line.strip() for line in file]
        my_dict = {idx: value for idx, value in enumerate(param_list)}
    return my_dict


def bi_check(low, high, dict_test):
    '''
    :param low:
    :param high:
    :param dict_test:
    :return:
    '''
    print('low-------------------------------', low)
    print('high------------------------------', high)
    if low + 1 >= high:
        return
    mid = (low + high) // 2
    print('mid is ', mid)
    print('value is',dict_test[mid])
    # 执行命令后,返回pass 或 fail的结果
    # 单次执行命令需要提供的参数是 所有需要去二分的数据
    mid_result = bin_check(dict_test, mid)
    # 根据执行结果,去重新定界二分的范围。
    if mid_result == 'pass':
        high = mid
        print(mid, ':pass')
    if mid_result == 'fail':
        low = mid
        print(mid, ':fail')
    print('----------------------------------------------------------------------end')
    bi_check(low, high, dict_test)


# 参数放在txt文件里,转换成字典类型。
dict_test = change_type(case_name)
print(dict_test)
low = 0
high = len(dict_test) - 1
bi_check(low, high, dict_test)


# bin_check.py
import subprocess
import os
import sys

# 以当前的文件的目录为坐标
cur_path = os.path.abspath(os.path.dirname(__file__))
run_num = 0


# 把需要二分的包转换成自己需要的格式,result 结果是'' pass, fail ,lost package(下载的包不符合我们自己的要求,就标记这个) 。
# 最好生成列表套字典的格式,方便排序,记录
# [{'cann_pack_name': '20240620_093006936_I4018384', 'result': ''},]
# 考虑转化时,过滤掉空行
def change_type(case_txt):
    with open(case_txt, 'r') as file:
        param_list = [line.strip() for line in file if line.count("_") == 2]
        my_dict = [{'cann_pack_name': i, 'result': ''} for i in param_list]
    return my_dict


# 下载CANN包
# 创建一个cann_package_name的包名,在这个目录里,下载包,检查包,安装包。

# 保证最后下载好的包放在cann_package_name 这个包名的目录里就行。
def down_cann_pak_pre(cann_pack_name):
    os.chdir(cur_path)
    os.system('rm -rf {}'.format(cann_pack_name))
    os.system('mkdir {}'.format(cann_pack_name))
    os.system('cp download_only.py  {}'.format(cann_pack_name))
    os.chdir(os.path.join(cur_path, cann_pack_name))
    os.system('pwd')
    os.system('python3 download_only.py  {}'.format(cann_pack_name))


# 检测是否有自己需要的CANN包
# 看是否需要简单优化一下,尽量不传入全名。
def check_CANN_package(cann_pack_name, cann_lsit):
    # cann_pack_name = '20240618_164626868_I460ad83'
    # 判断是这次的包是否符合要求
    is_re_down = 'no'
    for cann_name in cann_lsit:
        file_path = "/".join([cur_path, cann_pack_name, cann_name])  # 文件路径
        print(file_path)
        if os.path.isfile(file_path):
            file_size = os.path.getsize(file_path)
            file_size = file_size // (1024 * 1024)
            # 包文件小于1MB的话,可能是下载有问题,当成空文件处理。
            if file_size >= 1:
                print('文件-----[{:<60}] [{:<10}]MB status=[OK]'.format(cann_name, file_size))
            else:
                print('文件-----[{:<60}] [{:<10}]MB status=[Fail]'.format(cann_name, file_size))
                is_re_down = 'yes'
                # 如果文件有问题,这次装包作废,需要重新选包并且重新生成新的 case_txt
        else:
            is_re_down = 'yes'
    # 检查完成所有的包之后,再返回。
    print('is_re_down is ', is_re_down)
    return is_re_down


# 下载包后,保证安装包脚本,和包在一个路径下。
def install_package(cann_pack_name):
    os.chdir(cur_path)
    os.system('cp install_only.sh  {}'.format(cann_pack_name))
    os.system('pwd')
    # os.system('cd {}/{}'.format(cur_path, cann_pack_name))
    os.chdir(os.path.join(cur_path, cann_pack_name))
    os.system('pwd')
    os.system("./install_only.sh")


# 执行命令并且获取返回值,
# case_name support_custom_cache_path_001
# cann_pack_name 20240331_000121881_newest
def excute_order(case_name, cann_pack_name):
    os.chdir(cur_path)
    result = subprocess.run(['./zrexfu.sh', case_name, cann_pack_name])
    if result.returncode == 0:
        print('pass')
        return "pass"
    elif result.returncode == 1:
        print('fail')
        return "fail"


# 从 a.txt 读取参数,转成字典的格式
# with open('a.txt', 'r') as file:
#     param_list = [line.strip() for line in file]
#
# my_dict = {idx: value for idx, value in enumerate(param_list)}


# 重新生成my_dict:
def re_change_type(case_name_de):
    with open(case_txt, 'r') as file:
        param_list = [line.strip() for line in file]
        my_dict = {idx: value for idx, value in enumerate(param_list)}


def test_excute_order(j, dict_test):
    # run_num = len(dict_test) - 1
    # for j in range(run_num):
    cann_package = dict_test[j]['cann_pack_name']
    if '20240620_' in cann_package:
        case_result = 'pass'
    elif '20240621_' in cann_package:
        case_result = 'fail'
    else:
        print('key值是', dict_test[j]['cann_pack_name'])
    return case_result


# 二分的命令
def bi_check(low, high, case_name, dict_test, dict_test_ori):
    '''
    low:二分的开始
    high:二分结束
    case_name:二分的用例名字
    dict_test:二分的数据都在里面
    dect_test_ori:二分数据的记录,更新结果。
    '''
    for j in dict_test_ori:
        print(j)

    global run_num
    run_num = run_num + 1
    # high是二分数据的最大值
    # high = len(dict_test) - 1
    print('low-------------------------------', low, dict_test[low])
    print('high------------------------------', high, dict_test[high])
    # 可以考虑每次到这里就更新数据,或者打印一下需要展示的数据。
    if low + 1 >= high:
        print('----------------------------结果如下---------------------------------')
        for i in dict_test_ori:
            print(i)
        sys.exit()
    mid = (low + high) // 2
    print('mid is ', mid)
    cann_pack_name = dict_test[mid]["cann_pack_name"]  # 取出中间mid的值,即20240621_172455102_Ic545fa3
    print('*****************************************************************************************')
    print(f'This is the [ {run_num} ]  check , and cann_pack_name  is [{cann_pack_name}]')
    print('*****************************************************************************************')
    # 下载包
    down_cann_pak_pre(cann_pack_name)
    # 检查需要安装的包是否齐全,不齐全result_is_rerun 值返回yes.
    result_is_rerun = check_CANN_package(cann_pack_name, cann_lsit=cann_lsit_date)
    # 如果包有问题,不满足自己的安装需要,需要更新dict_test
    if result_is_rerun == 'yes':
        for i in range(len(dict_test_ori)):
            if dict_test_ori[i]['cann_pack_name'] == cann_pack_name:
                dict_test_ori[i]['result'] = 'lost_package' + str(run_num)
                print(dict_test_ori[i]['result'], "********lost_package***********")
        # 直接删除dict_test[mid]这个值,更新dict_test
        a = dict_test.pop(mid)
        print('This cann_pack is not satisfy needs', a)
        # 对于更新后的dict_test。需要有新的high. low不变。high 是最大值,少一个包,high就少了一个1.
        high = high - 1
        bi_check(low, high, case_name, dict_test, dict_test_ori)
    # 安装CANN包。考虑安装后是否自动删除CANN包。
    install_package(cann_pack_name)
    # 跑用例
    mid_result = excute_order(case_name, cann_pack_name)
    # mid_result = excute_case(mid, dict_test)
    # 根据执行结果,去重新定界二分的范围。
    if mid_result == 'pass':
        high = mid
        print(f'{high}:{cann_pack_name} :pass')
        for i in range(len(dict_test_ori)):
            if dict_test_ori[i]['cann_pack_name'] == cann_pack_name:
                dict_test_ori[i]['result'] = 'pass' + str(run_num)
    elif mid_result == 'fail':
        low = mid
        print(f'{low}:{cann_pack_name} :fail')
        for i in range(len(dict_test_ori)):
            if dict_test_ori[i]['cann_pack_name'] == cann_pack_name:
                dict_test_ori[i]['result'] = 'fail' + str(run_num)
    else:
        print(f'{dict_test_ori[mid]}  Did not get  reuslt ')
        return
    print('----------------------------------------------------------------------end')
    bi_check(low,high, case_name, dict_test, dict_test_ori)


if __name__ == '__main__':
    # 参数放在txt文件里 。
    case_txt = 'a.txt'
    file_path = "/".join([cur_path, case_txt])  # 文件路径
    if not os.path.isfile(file_path):
        print('--------------------------缺少{},需要把数据放到{}这个文件里---------------------------'.format(case_txt,
                                                                                                              case_txt))
        exit()
    # dict_test=[{'cann_pack_name': '20240621_205524724_I776ef4d', 'result': ''}, {'cann_pack_name': '20240621_205458628_Ia3dbf1c', 'result': ''},]
    dict_test = change_type(case_txt)  # 考虑python直接复制问题,还有一个是怎么给cann_pack_name打上标签的问题。
    # 用来做一个最终记录
    dict_test_ori = change_type(case_txt)
    print(dict_test)
    for i in dict_test:
        print(i)
    # low是第一个数
    low = 0
    high = len(dict_test) - 1
    run_num = 0
    # 用例名和  二分必须要安装的包的名字。
    cann1 = 'CANN-aoe-7.3.t10.0.b528-linux.x86_64.run'
    cann2 = 'CANN-compiler-7.3.t10.0.b528-linux.x86_64.run'
    cann3 = 'CANN-fwkplugin-7.3.t10.0.b528-linux.x86_64.run'
    cann4 = 'CANN-hccl-7.3.t10.0.b528-linux.x86_64.run'
    cann5 = 'CANN-opp-7.3.t10.0.b528-linux.x86_64.run'
    cann6 = 'CANN-runtime-7.3.t10.0.b528-linux.x86_64.run'
    cann7 = 'CANN-toolkit-7.3.t10.0.b528-linux.x86_64.run'

    case_name = 'case21_op_while_staticShape_atmFalse_infer'
    cann_lsit_date = [cann1, cann2, cann3, cann4, cann5, cann6, cann7]
    # cann_pack_name = '20240331_000121881_newest'
    print('本次二分的用例是', case_name)
    # 防止误跑
    user_input = input("确认运行输入YES:")
    if user_input == 'YES':
        bi_check(low, high, case_name, dict_test, dict_test_ori)
    else:
        print("----------------退出程序---------------------")

import subprocess
import os
import sys

# 以当前的文件的目录为坐标
cur_path = os.path.abspath(os.path.dirname(__file__))
run_num = 0


# 把需要二分的包转换成自己需要的格式,result 结果是'' pass, fail ,lost package(下载的包不符合我们自己的要求,就标记这个) 。
# 最好生成列表套字典的格式,方便排序,记录
# [{'cann_pack_name': '20240620_093006936_I4018384', 'result': ''},]
# 考虑转化时,过滤掉空行
def change_type(case_txt):
    with open(case_txt, 'r') as file:
        param_list = [line.strip() for line in file if line.count("_") == 2]
        my_dict = [{'cann_pack_name': i, 'result': ''} for i in param_list]
    return my_dict


# 下载CANN包
# 创建一个cann_package_name的包名 20240620_093006936_I4018384   ,在这个目录里,下载包,检查包,安装包。

# 保证最后下载好的包放在cann_package_name 这个包名的目录里就行。
def down_cann_pak_pre(cann_pack_name):
    os.chdir(cur_path)
    os.system('rm -rf {}'.format(cann_pack_name))
    os.system('mkdir {}'.format(cann_pack_name))
    os.system('cp download_only.py  {}'.format(cann_pack_name))
    os.chdir(os.path.join(cur_path, cann_pack_name))
    os.system('pwd')
    os.system('python3 download_only.py  {}'.format(cann_pack_name))


# 检测是否有自己需要的CANN包
# 看是否需要简单优化一下,尽量不传入全名。
def check_CANN_package(cann_pack_name, cann_lsit):
    # cann_pack_name = '20240618_164626868_I460ad83'
    # 判断是这次的包是否符合要求
    is_re_down = 'no'
    for cann_name in cann_lsit:
        file_path = "/".join([cur_path, cann_pack_name, cann_name])  # 文件路径
        print(file_path)
        if os.path.isfile(file_path):
            file_size = os.path.getsize(file_path)
            file_size = file_size // (1024 * 1024)
            # 包文件小于1MB的话,可能是下载有问题,当成空文件处理。可以手动确认一下
            if file_size >= 1:
                print('文件-----[{:<60}] [{:<10}]MB status=[OK]'.format(cann_name, file_size))
            else:
                print('文件-----[{:<60}] [{:<10}]MB status=[Fail]'.format(cann_name, file_size))
                is_re_down = 'yes'
                # 如果文件有问题,这次装包作废,需要重新选包并且重新生成新的 case_txt
        else:
            is_re_down = 'yes'
    # 检查完成所有的包之后。
    print('is_re_down is ', is_re_down)
    return is_re_down


# 下载包后,保证安装包脚本,和包在一个路径下。
def install_package(cann_pack_name):
    os.chdir(cur_path)
    os.system('cp install_only.sh  {}'.format(cann_pack_name))
    os.system('pwd')
    # os.system('cd {}/{}'.format(cur_path, cann_pack_name))
    os.chdir(os.path.join(cur_path, cann_pack_name))
    os.system('pwd')
    os.system("./install_only.sh")


# 执行命令并且获取返回值,
# case_name support_custom_cache_path_001
# cann_pack_name 20240331_000121881_newest
def excute_order(case_name, cann_pack_name):
    os.chdir(cur_path)
    result = subprocess.run(['./zrexfu.sh', case_name, cann_pack_name])
    if result.returncode == 0:
        print('------pass------')
        return "pass"
    elif result.returncode == 1:
        print('-------fail--------')
        return "fail"


# 从 a.txt 读取参数,转成字典的格式
# with open('a.txt', 'r') as file:
#     param_list = [line.strip() for line in file]
#
# my_dict = {idx: value for idx, value in enumerate(param_list)}


# 调试函数
def test_excute_order(j, dict_test):
    # run_num = len(dict_test) - 1
    # for j in range(run_num):
    cann_package = dict_test[j]['cann_pack_name']
    if '20240620_' in cann_package:
        case_result = 'pass'
    elif '20240621_' in cann_package:
        case_result = 'fail'
    else:
        print('key值是', dict_test[j]['cann_pack_name'])
    return case_result


# 二分的命令
def bi_check(low, high, case_name, dict_test, dict_test_ori):
    '''
    low:二分的开始
    high:二分结束
    case_name:二分的用例名字
    dict_test:实时二分的数据都在里面
    dect_test_ori:记录二分数据的记录,更新结果。
    '''
    # 每次二分前,打印当前的二分结果
    # for j in dict_test_ori:
    #     print(j)
    for i in dict_test_ori:
        print(i)

    global run_num
    run_num = run_num + 1
    # high是二分数据的最大值
    # high = len(dict_test) - 1
    print('low-------------------------------', low, dict_test[low])
    print('high------------------------------', high, dict_test[high])
    # 可以考虑每次到这里就更新数据,或者打印一下需要展示的数据。
    if low + 1 >= high:
        print('----------------------------结果如下---------------------------------')
        for i in dict_test_ori:
            print(i)
        sys.exit()
    mid = (low + high) // 2
    print('mid is ', mid)
    cann_pack_name = dict_test[mid]["cann_pack_name"]  # 取出中间mid的值,即20240621_172455102_Ic545fa3
    print('*****************************************************************************************')
    print(f'This is the [ {run_num} ]  check , and cann_pack_name  is [{cann_pack_name}]')
    print('*****************************************************************************************')
    # 下载包
    down_cann_pak_pre(cann_pack_name)
    # 检查需要安装的包是否齐全,不齐全result_is_rerun 值返回 yes.
    result_is_rerun = check_CANN_package(cann_pack_name, cann_lsit=cann_lsit_date)
    # 如果包有问题,不满足自己的安装需要,需要更新dict_test,删除这个时间戳,重排
    if result_is_rerun == 'yes':
        for i in range(len(dict_test_ori)):
            if dict_test_ori[i]['cann_pack_name'] == cann_pack_name:
                dict_test_ori[i]['result'] = 'lost_package' + str(run_num)
                print(dict_test_ori[i]['result'], "********lost_package***********")
        # 直接删除dict_test[mid]这个值,更新dict_test
        a = dict_test.pop(mid)
        print('This cann_pack is not satisfy needs', a)
        # 对于更新后的dict_test。需要有新的high. low不变。high 是最大值,少一个包,high就少了一个1.
        high = high - 1
        bi_check(low, high, case_name, dict_test, dict_test_ori)
    # 安装CANN包。考虑安装后是否自动删除CANN包。
    install_package(cann_pack_name)
    # 跑用例
    mid_result = excute_order(case_name, cann_pack_name)
    # mid_result = excute_case(mid, dict_test)
    # 根据执行结果,去重新定界二分的范围。
    if mid_result == 'pass':
        high = mid
        print(f'{high}:{cann_pack_name} :pass')
        for i in range(len(dict_test_ori)):
            if dict_test_ori[i]['cann_pack_name'] == cann_pack_name:
                dict_test_ori[i]['result'] = 'pass' + str(run_num)
    elif mid_result == 'fail':
        low = mid
        print(f'{low}:{cann_pack_name} :fail')
        for i in range(len(dict_test_ori)):
            if dict_test_ori[i]['cann_pack_name'] == cann_pack_name:
                dict_test_ori[i]['result'] = 'fail' + str(run_num)
    else:
        print(f'{dict_test_ori[mid]}  Did not get  reuslt ')
        return
    print('----------------------------------------------------------------------end')
    bi_check(low, high, case_name, dict_test, dict_test_ori)


if __name__ == '__main__':
    # 参数放在txt文件里 。
    if len(sys.argv) != 2:
        exit('运行参数有误,按照python3 xxxx.py  case_name  方式运行')
    # 本次二分跑的用例名
    case_name = sys.argv[1]
    # a.txt文件放在二分脚本同级目录下
    case_txt = 'a.txt'
    file_path = "/".join([cur_path, case_txt])  # 文件路径
    if not os.path.isfile(file_path):
        print('--------------------------缺少{},需要把数据放到{}这个文件里---------------------------'.format(case_txt,
                                                                                                case_txt))
        exit()
    # dict_test=[{'cann_pack_name': '20240621_205524724_I776ef4d', 'result': ''}, {'cann_pack_name': '20240621_205458628_Ia3dbf1c', 'result': ''},]
    dict_test = change_type(case_txt)  # 考虑python直接复制问题,还有一个是怎么给cann_pack_name打上标签的问题。
    # dict_test_ori用来做一个最终记录
    dict_test_ori = change_type(case_txt)
    print(dict_test)
    # for i in dict_test:
    #     print(i)
    for index, item in enumerate(dict_test_ori, start=0):
        print(f"{index} :{item}")
    # low是第一个数
    low = 0
    high = len(dict_test) - 1
    # 记录第几次二分
    run_num = 0
    #  明确好二分必须要安装的CANN包的名字,如果这个时间戳的包缺少这个CANN包, 就重新选定。
    cann1 = 'CANN-aoe-7.3.t10.0.b528-linux.x86_64.run'
    cann2 = 'CANN-compiler-7.3.t10.0.b528-linux.x86_64.run'
    cann3 = 'CANN-fwkplugin-7.3.t10.0.b528-linux.x86_64.run'
    cann4 = 'CANN-hccl-7.3.t10.0.b528-linux.x86_64.run'
    cann5 = 'CANN-opp-7.3.t10.0.b528-linux.x86_64.run'
    cann6 = 'CANN-runtime-7.3.t10.0.b528-linux.x86_64.run'
    cann7 = 'CANN-toolkit-7.3.t10.0.b528-linux.x86_64.run'

    cann_lsit_date = [cann1, cann2, cann3, cann4, cann5, cann6, cann7]
    # cann_pack_name = '20240331_000121881_newest'
    case_name = sys.argv[1]
    if len(cann_lsit_date) > 0:
        print('本次二分必须安装的包如下:')
        for i in cann_lsit_date:
            print(i)
    print('本次二分的用例是', case_name)
    # 确认下,防止误跑
    user_input = input("确认运行输入YES:")
    if user_input == 'YES':
        bi_check(low, high, case_name, dict_test, dict_test_ori)
    else:
        print("----------------退出程序---------------------")

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值