254day(if __name__ == '__main__': 原理及作用,sys模块)

本文详细解析了Python中if __name__ == '__main__': 的工作原理及其用途,并介绍了sys模块的重要函数,如sys.argv、sys.exit等,帮助读者理解如何控制脚本执行流程及进行系统级操作。

《2018年6月22日》【连续254天】

标题:if __name__ == '__main__': 原理及作用,sys模块;

内容:

if __name__ == '__main__': 

    一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ == 'main': 的作用就是控制这两种情况执行代码的过程,在if __name__ == 'main': 下的代码只有在第一种情况下(即文件作为脚本直接执行)才会被执行,而import到其他脚本中是不会被执行的。

原理:

每个python模块(python文件,也就是此处的test.py和import_test.py)都包含内置的变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py);如果import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“__main__”等于当前执行文件的名称(包含了后缀.py)。进而当模块被直接执行时,__name__ == 'main'结果为真。

 

sys模块:
sys模块的常见函数列表
sys.argv: 实现从程序外部向程序传递参数。
sys.exit([arg]): 程序中间的退出,arg=0为正常退出。
sys.getdefaultencoding(): 获取系统当前编码,一般默认为ascii。
sys.setdefaultencoding(): 设置系统默认编码,执行dir(sys)时不会看到这个方法,在解释器中执行不通过,可以先执行reload(sys),在执行 setdefaultencoding('utf8'),此时将系统默认编码设置为utf8。(见设置系统默认编码 )
sys.getfilesystemencoding(): 获取文件系统使用编码方式,Windows下返回'mbcs',mac下返回'utf-8'.
sys.path: 获取指定模块搜索路径的字符串集合,可以将写好的模块放在得到的某个路径下,就可以在程序中import时正确找到。
sys.platform: 获取当前系统平台。

sys.stdin,sys.stdout,sys.stderr: stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向输出和输入到其它设备( device ), 或者以非标准的方式处理它们

 

import datetime import os import sys sys.path.append('./') import pymysql from pathlib import Path from datetime import timedelta,datetime import shutil # logging.basicConfig(format='%(asctime)s [%(levelname)s] %(module)s - %(funcName)s - %(lineno)s: %(message)s', # datefmt='%Y-%m-%d %H:%M:%S', level=print) # # logging.getLogger().handlers.clear() def run(doris_ip, doris_port, doris_http_port, doris_db, doris_user, doris_pwd,statistic_time): db_doris = pymysql.connect(host=doris_ip, user=doris_user, passwd=doris_pwd, db=doris_db, port=int(doris_port)) doris_cursor = db_doris.cursor() e_time_1 = statistic_time + ' ' + '16:00:00' load_time_1 = str(datetime.now() - timedelta(days=1)).split(".")[0] s_time_1 = load_time_1[0:10] + ' ' + '14:00:00' print("connect success.") sql = f""" SELECT file_name,statistic_time from count_info_defect where file_name not in ( select DISTINCT file_name from ods_defect_main_table te where file_time >%s and file_time <%s and fab = 'FAB10' ) and statistic_time > %s and data_type = 'defect' """ print(sql) doris_cursor.execute(sql,(s_time_1, e_time_1,statistic_time)) image_file_name_list = doris_cursor.fetchall() print(f"current not mapping list: {image_file_name_list}") for image_info in image_file_name_list: file_name = image_info[0] file_datetime = image_info[1] files = find_path(file_datetime, file_name) if len(files) == 0: # 往前找一天 last_day = file_datetime - timedelta(days=1) files = find_path(last_day, file_name) for file in files: target_path = os.path.join(parse_path, os.path.basename(file)) shutil.copy2(file, target_path) print(f"copy file from {file} to {target_path}") def find_path(date, file): date_str = date.strftime("%Y-%m-%d") search_path = os.path.join(back_path, date_str) print(f"search_path: {search_path}") path = Path(search_path) files = [str(file.resolve()) for file in path.rglob(f"*{file}*") if file.is_file()] files_str = '\n'.join(files) print(f"find files: {files_str}") return files if __name__ == '__main__': # 10.100.254.42 19030 18030 semi_de_yms_db semi Semi@200 2025-03-10 doris_ip = sys.argv[1] doris_port = sys.argv[2] doris_http_port = sys.argv[3] doris_db = sys.argv[4] doris_user = sys.argv[5] doris_pwd = sys.argv[6] statistic_time = sys.argv[7] back_path = "/nasdata/data_bak/defect" parse_path = f'/nasdata/ftp/daily_check/{statistic_time}/defect' os.makedirs(parse_path,exist_ok=True) print(f"start image mapping. {datetime.now()}") run(doris_ip, doris_port, doris_http_port, doris_db, doris_user, doris_pwd,statistic_time) print(f"end image mapping. {datetime.now()}") 解释分析这段代码
最新发布
10-16
讲一下代码: import logging from configparser import ConfigParser import openpyxl from time import strftime import sys from os import path, walk import xml.etree.ElementTree as ET # 修改logging打印等级 logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s -%(message)s') class IspCheck(): """ isp参数变动后快速筛选测试项 """ # todo 补充机型名信息 def __init__(self): device_info = self.start_test_get_config() self.device_name = device_info['DEVICE_NAME'] self.old_isp_cfg_path = device_info['old_isp_cfg_path'] self.new_isp_cfg_path = device_info['new_isp_cfg_path'] self.py_path = device_info['py_path'] # 读取配置文件,返回配置信息+py路径信息字典 def start_test_get_config(self): logging.debug('加载配置文件.........') element_dict = {} if hasattr(sys, 'frozen'): py_path = path.dirname(sys.executable) else: py_path = path.dirname(__file__) # 添加py文件或exe文件所在路径 element_dict["py_path"] = py_path # 读取配置文件 xml_path = path.join(py_path, 'isp_check_config.xml') info_tree = ET.parse(xml_path) root = info_tree.getroot() # 加载根节点 element_name = root.iter() # 遍历根节点所有后代 for e in element_name: element_dict[e.tag] = e.text logging.debug('加载配置文件结束......') return element_dict def confirm_test_example(self, sheet, param_list): """ 根据参数的单元格位置,在测试项一列中找到对应的测试项 :param sheet: 工作表对象 :param param_list: [section, option, old_param, new_param, row]格式的参数列表 :return: """ row = param_list[4] while True: data_area = "E" + str(row) data_value = sheet[data_area].value if data_value: if "【ISO±1倍】" in data_value: param_ISO = self.find_param_ISO(sheet, param_list[4]) test_example = '【' + param_ISO + '±1倍】\n' + data_value return test_example elif "【lv±1】" in data_value: # todo 根据测试项中的特殊值进一步判断测试项 param_LV = self.find_param_LV(param_list[2], param_list[3]) test_example = '【' + param_LV + '±1】\n' + data_value return test_example else: return data_value else: row -= 1 def confirm_param_parent(self, sheet, row, parent_param): """ 根据参数的单元格位置,向上搜索判断其父节点为所需的节点 :param sheet: 工作表对象【参考模块:param row: 参数所在单元格的行数 :param parent_param: 参数对应的父节点 :return: 是所需的父节点,返回True,否则返回False """ while True: data_area = "A" + str(row - 1) data_value = sheet[data_area].value section = "[" + parent_param + "]" if "[" in data_value: if data_value == section: return True else: return False else: row -= 1 def find_param_ISO(self, sheet, row): """ 判断具体测试的ISO项 :param sheet: 工作表对象【模板参考表】 :param row: 参数所在的单元格行数 :return:返回参数对应的ISO项 """ while True: data_area = "D" + str(row) data_value = sheet[data_area].value if data_value: # print(data_value) # 调试打印 return data_value else: row -= 1 def find_param_LV(self, old_lv_param, new_lv_param): # todo """ :param old_lv_param: 带lv等级的旧参数 :param new_lv_param: 带lv等级的新参数 :return: 返回有差异的lv等级 """ diff_lv_str = "lv" old_lv_param_list = old_lv_param.split(',') new_lv_param_list = new_lv_param.split(',') for lv_n in range(20): if old_lv_param_list[lv_n] != new_lv_param_list[lv_n]: diff_lv_str = diff_lv_str + "_" + str(lv_n) return diff_lv_str def find_diff_param(self, isp_old_path, isp_new_path): """ 对比查询新旧ISP不同参数 :param isp_old_path: 旧isp地址 :param isp_new_path: 新isp地址 :return: 以[section, option, old_param, new_param]格式返回不同参数信息 """ diff_param_list = [] old_config_parser = ConfigParser() old_config_parser.read(isp_old_path) new_config_parser = ConfigParser() new_config_parser.read(isp_new_path) old_sections = old_config_parser.sections() for section in old_sections: old_options = old_config_parser.options(section) for option in old_options: old_param = old_config_parser.get(section, option) new_param = new_config_parser.get(section, option) if old_param == new_param: pass else: diff_param_list.append([section, option, old_param, new_param]) return diff_param_list # todo 加入isp_name,用于定位sheet表,以便区分线性、HDR、夜视的测试项 def find_param_in_test(self, diff_param_list, isp_name): """ 根据不同参数信息,查找到该参数的行数,添加到参数列表中 :param diff_param_list: 在find_diff_param返回的不同参数列表[section, option, old_param, new_param] :return: 添加row信息的不同参数列表 """ workbook = openpyxl.load_workbook(r"VIGI ISP.xlsx") sheet = workbook[isp_name] for param_list in diff_param_list: for row in sheet.iter_rows(min_col=1, max_col=1): # 遍历第一列的所有行 for cell in row: # 找到参数一致的行,再确认其父节点是否正常 if cell.value == param_list[1]: #todo 后续可优化逻辑,先找父节点,再向下找参数 if self.confirm_param_parent(sheet, cell.row, param_list[0]): param_list.append(cell.row) test_example = self.confirm_test_example(sheet, param_list) param_list.append(test_example) logging.debug(f"修改参数:{param_list[0]}-->{param_list[1]}") return diff_param_list def write_diff_param(self, workbook, isp_name, diff_param_test_list): """ 不同参数信息写入新表 :param isp_name: isp文件的名称,如day_isp,night_isp :param diff_param_list: 在find_param_in_test返回的不同参数列表 :return: 在VIGI ISP.xlsx写入新表 """ sheet_diff_param = workbook.create_sheet(isp_name) sheet_diff_param.cell(row=1, column=1, value="参数块") sheet_diff_param.cell(row=1, column=2, value="参数名") sheet_diff_param.cell(row=1, column=3, value="旧参数") sheet_diff_param.cell(row=1, column=4, value="新参数") sheet_diff_param.cell(row=1, column=5, value="位置") sheet_diff_param.cell(row=1, column=6, value="测试项") row = 2 for param in diff_param_test_list: sheet_diff_param.cell(row=row, column=1, value=param[0]) sheet_diff_param.cell(row=row, column=2, value=param[1]) sheet_diff_param.cell(row=row, column=3, value=param[2]) sheet_diff_param.cell(row=row, column=4, value=param[3]) # 在模板中不存在的参数,写入”人工处理“ if len(param) == 6: sheet_diff_param.cell(row=row, column=5, value=param[4]) sheet_diff_param.cell(row=row, column=6, value=param[5]) else: sheet_diff_param.cell(row=row, column=5, value="人工处理") sheet_diff_param.cell(row=row, column=6, value="人工处理") row += 1 def get_isp_path(self, isp_cfg_path): isp_path_list = [] paths = walk(isp_cfg_path) for pat, dir_lst, file_lst in paths: for fil_name in file_lst: if '.cfg' in fil_name: isp_path_list.append(path.join(pat, fil_name)) return isp_path_list def run(self): old_isp_path_list = self.get_isp_path(self.old_isp_cfg_path) new_isp_path_list = self.get_isp_path(self.new_isp_cfg_path) workbook = openpyxl.Workbook() for i in range(len(new_isp_path_list)): isp_name = path.basename(new_isp_path_list[i]) logging.info(f"查询{isp_name}的测试项") diff_param_list = ISP.find_diff_param(old_isp_path_list[i], new_isp_path_list[i]) diff_param_test_list = ISP.find_param_in_test(diff_param_list, isp_name) ISP.write_diff_param(workbook, isp_name, diff_param_test_list) test_xlsx_path = self.device_name + strftime("_%Y%m%d") + ".xlsx" workbook.save(test_xlsx_path) if __name__ == "__main__": # todo 加入开始接口 ISP = IspCheck() ISP.run() input("【enter】结束运行")
10-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值