预编译pyc
# py3.10.3importcompileallimportreimporttimefrompathlibimportPathimportshutilfromloguruimportloggerclassPack(object):'''打包'''def__init__(self,input:str,is_dir=True):self.input:Path=Path(input)# 待编译的输入目录/单个文件self.output:Path=self.get_desk_top()# 输出到桌面路径self.is_dir:bool=is_dir# 是否为目录或单个文件 True为目录 False为单个文件self.exclude_pattern=re.compile(r"(\.venv/|\.git/)")# 排除的目录正则defget_desk_top(self):'''获取桌面路径'''returnPath.home().joinpath("Desktop")defpack_file(self):'''编译单个文件'''compileall.compile_file(fullname=str(self.input),# 必选:单个文件的完整路径force=True,# 强制重新编译optimize=2,# 最高优化级别quiet=0,legacy=True)logger.debug(f'编译【{self.input}】成功!')_file_path,_file_name=self.input.parent,self.input.stem# 提取输入的文件路径和文件名(不含后缀)pyc_filename=f'{_file_name}.pyc'# 生成后的pyc文件名称pyc_abs_path=Path(_file_path).joinpath(pyc_filename)# 生成的pyc绝对路径new_pyc_abs_path=self.output.joinpath(pyc_filename)# 要移动的目标绝对路径shutil.move(pyc_abs_path,new_pyc_abs_path)# 移动logger.success(f'移动文件【{pyc_abs_path}】-->【{new_pyc_abs_path}】')defpack_dir(self):'''编译整个项目'''compileall.compile_dir(dir=self.input,# 原项目目录optimize=2,# 最高优化,提升反编译难度maxlevels=10,# 递归深度无限制(0=不限制)quiet=1,# 0 表示完整输出,1 表示仅输出错误,legacy=True,# 如果为 True,则生成传统 pyc 路径,而不是 PEP 3147 路径workers=1,# 最大并行工作线程数force=True)dir_name=self.input.name# 项目名new_dir=self.output.joinpath(dir_name)# 复制到桌面的项目名ifnew_dir.exists():# 如果存在则删除shutil.rmtree(new_dir)new_dir.mkdir(parents=True,exist_ok=True)# 递归创建目录foriinself.input.rglob('*'):parts:tuple=i.partsifany(('.git'inparts,'venv'inparts,'.venv'inparts,'.idea'inparts)):# 排除文件continueifi.is_dir()ori.suffix=='.py':continuerel_path=i.relative_to(self.input)# 得到当前文件和输入目录的相对路径target_path=new_dir.joinpath(rel_path)# 得到目标输出绝对路径target_path.parent.mkdir(parents=True,exist_ok=True)# 创建目标输出的路径ifi.suffix=='.pyc':# 如果是pyc文件移动logger.success(f'移动:【{i}】-->【{target_path}】')shutil.move(i,target_path)else:# 负责为复制logger.success(f'复制:【{i}】-->【{target_path}】')shutil.copy2(i,target_path)defstart(self):'''开始'''ifself.is_dir:logger.warning(f'编译(目录)文件:【{self.input}】')time.sleep(0.5)self.pack_dir()else:logger.warning(f'编译(单独)文件:【{self.input}】')time.sleep(0.5)self.pack_file()a=Pack(r"D:\jiexun\htsy",is_dir=True)a.start()
打包exe
# coding=utf-8 py3.7.3# @Time : 2025-09-01 02:04# @Author : XiaoYi# @Email: 1206154726@qq.comimportosimportshutilfromloguruimportlogger desktop_dist=os.path.join(os.path.join(os.path.expanduser("~"),'Desktop'),'dist')desktop_main=os.path.join(desktop_dist,'main')# from urllib.parse import quote as url_quotelogger.debug(f'----------------------------开始构建程序--------------------------')os.system('pyinstaller main.py -i logo.ico')# 执行打包指令 pyinstaller -w main.py -i logo.ico 无调试窗口logger.success(f'------->基础镜像结束,开始打包静态资源')shutil.move(os.path.join(os.getcwd(),'dist'),desktop_dist)# 移动文件到桌面logger.debug(f'------->【dist】基础镜像结束')shutil.rmtree(os.path.join(os.getcwd(),'build'))# 删除打包构建文件os.remove(os.path.join(os.getcwd(),'main.spec'))# 删除打包构建文件logger.warning(f'------->【编译文件清除】清除结束')shutil.copyfile(os.path.join(os.getcwd(),'config.yaml'),os.path.join(desktop_main,'config.yaml'))shutil.copyfile(os.path.join(os.getcwd(),'chromedriver.exe'),os.path.join(desktop_main,'chromedriver.exe'))os.rename(os.path.join(desktop_main,'main.exe'),os.path.join(desktop_main,'新球体育.exe'))# 重命名打包后的文件os.rename(desktop_main,os.path.join(desktop_dist,'xinqiutiyu'))# 重命名打包后的文件logger.success(f'-------【打包结束】----------')