py打包工具

编程入门 行业动态 更新时间:2024-10-24 22:26:38

py打包<a href=https://www.elefans.com/category/jswz/34/1770073.html style=工具"/>

py打包工具

库地址:

auto-py-to-exe

/

Gooey

/

为什么要介绍这俩库?

  1. 直接丢代码给别人用:各种配置环境要有才能执行
  2. 命令行执行:丑
  3. 打包复杂
  4. 可视化界面编写复杂

auto-py-to-exe

auto-py-to-exe 是一个用于将Python程序打包成可执行文件的图形化工具。以往打包会使用pyinstaller库,需要掌握各种参数的作用,很难记。而auto-py-to-exe 基于 pyinstaller ,和相比pyinstaller ,多了 GUI 界面,用起来更为简单方便。

安装

# py版本 3.6-3.10
pip install auto-py-to-exe

启动

auto-py-to-exe

常用选项介绍

  • 单文件

    • 单文件:打包的可执行文件就一个,把所有的依赖都打包到一个文件中

    • 单目录:打包的可执行文件在输出目录中,包含了依赖文件、库

  • 控制台窗口

    • 控制台:所有的交互在控制台显示
    • 窗口:编写了窗体界面才能用此选项,隐藏控制台,仅展示编写的窗体
  • 图标

    可执行文件的图标,需要是ico格式

  • 附加文件

    • 添加文件:脚本依赖外部文件,即添加单个文件作为依赖
    • 添加目录:脚本依赖外部库(或多个文件),添加对应目录作为依赖
  • 高级选项

    • 常规选项
      • name:执行文件的名称
      • clean:打包前是否清除缓存
    • 捆绑选项
      • add-binary:如果用到可执行文件,可以添加进去
      • paths:搜搜依赖库的目录*(一般不用)*
      • key:编译的临时文件是否需要加密,如果是核心代码,建议加密。
    • windows特定选项
      • version-file:版本文件,一般不用
  • 设置

    • 输出路径:用于生成打包文件存放的地方
  • 当前命令

    用于展示pyinstaller打包的命令

  • 输出

    展示打包的过程

实践

功能

编写一个简单的交互式脚本,实现输入一个数,输出这个数加3的值。

编写脚本

  • 脚本结构

  • 文件内容

# Add3.pydef add3(x):return x + 3
# run_it.pyimport time
from Fun.Add3 import add3if __name__ == '__main__':n = input('请输入一个数:')print(add3(int(n)))time.sleep(10)  # 避免执行完直接退出了,啥都看不到

看一下正常的控制台交互效果:

文件打包

生成文件

如果不想生成一个目录,可以选择生成一个文件,【单文件】选择单文件即可。

Gooey

一个快速构建可视化页面的工具库,自带封装好了的各种组件,只需一行命令就能生成一个带界面的工具。

安装

# py 2.7 3.x
pip install Gooey

改写脚本

# run_it.pyfrom Fun.Add3 import add3
from gooey import Gooey, GooeyParser@Gooey(program_name="工具的名字啊")
def main():parser = GooeyParser(description="第一个示例!")parser.add_argument("x",metavar=u'输入的数:',help="请输入一个整数")args = parser.parse_args()try:res = add3(int(args.x))print(res)except TypeError as e:print('哎呀,报错了')if __name__ == '__main__':main()

运行

组件介绍

组件– a –
FileChooser文件选择器
MultiFileChooser文件多选器
DirChooser目录选择器
MultiDirChooser目录多择器
DateChooser日期选择器
TextField文本输入框
Dropdown单选框
RadioGroup复选框

全局配置

参数介绍
advanced切换显示全部设置还是仅仅是简化版本
show_config跳过所有配置并立即运行程序
language指定从 gooey/languages 目录读取哪个语言包
program_nameGUI 窗口显示的程序名。默认会显 sys.argv[0]。
program_descriptionSettings 窗口顶栏显示的描述性文字。默认值从 ArgumentParser 中获取。
default_size窗口默认大小,(600,400)
required_cols设置必选参数行数。
optional_cols设置可选参数行数。
dump_build_config将设置以 JSON 格式保存在硬盘中以供编辑/重用。
richtext_controls打开/关闭控制台对终端控制序列的支持(对字体粗细和颜色的有限支持)

支持多种结构布局

实践

图片角度修正可视化工具

目录结构

文件

# main.py
import os
from fun import *from gooey import Gooey, GooeyParser@Gooey(richtext_controls=True,  # 打开终端对颜色支持program_name="爱标xx工具",  # 程序名称encoding="utf-8",  # 设置编码格式,打包的时候遇到问题progress_regex=r"^progress: (\d+)%$",  # 正则,用于模式化运行时进度信息menu=[{'name': '文件','items': [{'type': 'AboutDialog','menuTitle': '关于','name': '图片旋转角度处理工具','description': '用于处理标注页面图片看起来正常,但是切图后发现图片和画框的位置不一致,例:倒置、旋转等','developer': 'wjlv4@iflytek',}, {'type': 'Link','menuTitle': '访问主页','url': '/'}]}, {'name': '帮助','items': [{'type': 'AboutDialog','menuTitle': '帮助文档','name': '图片旋转角度处理帮助','description': '标注页面画框后预览图片出现倒置、旋转等问题自助处理步骤:\n1. 打开浏览器调试窗口(F12)\n2. 点击Network(网络)\n3. 点击标注页面框的√号\n4. 在调试窗口的“网络”中找到ocr?url=的请求后,鼠标点击此请求\n5. 复制右侧地址中的/test/xxxx/xxxx.jpg到工具输入栏',}]}]
)
def main():parser = GooeyParser(description="平台辅助工具:图片旋转角度修正、入库试题可视化 ...")subs = parser.add_subparsers(help='commands', dest='command')draw_pic = subs.add_parser('入库图片可视化')pic_fix = subs.add_parser('图片旋转角度修正')pic_fix.add_argument('source_page_url',metavar='图片路径',help='请输入ocr图片的路径以/test开头.jpg结尾',widget='TextField')pic_fix.add_argument("rotate",metavar=u'旋转角度:',help="图片需要旋转的角度(逆时针)",# 选项choices=['90', '180', '270', '0'],# 默认值default='180',# 下拉菜单widget='Dropdown',# 数据校验gooey_options={'validator': {'test': "user_input in ['0','90', '180', '270']",'message': "仅能输入90、180、270、0]"}})draw_pic.add_argument("page_path",metavar=u'请输入待处理目录',help="page.json和topic.json所在的目录",# 下拉菜单widget='DirChooser')args = parser.parse_args()if getattr(args, 'page_path', None):run(os.path.join(args.page_path, 'page.json'))elif getattr(args, 'source_page_url', None):deal_pic(args.source_page_url, int(args.rotate))# 将界面收集的参数进行处理
# ......if __name__ == '__main__':main()
# zzj_rotate_pic.py# coding:utf8
import sysimport requests
from PIL import Image
from fun.Log import *def resource_path(relative_path):""" Get absolute path to resource, works for dev and for PyInstaller """try:# PyInstaller creates a temp folder and stores path in _MEIPASSbase_path = sys._MEIPASSexcept Exception:base_path = os.path.abspath(".")return os.path.join(base_path, relative_path)def download_src(source_page_url, out_file_path='before.jpg'):"""下载原图:param out_file_path:保存路径:param source_page_url: 原图url:return:"""logger.info(f' download {source_page_url}')print('progress: 15%')if not source_page_url.startswith('http'):url = r""source_page_url = url + '?path=' + source_page_url# 下载并存储原图res = requests.get(source_page_url, stream=True)with open(out_file_path, 'wb') as f_w:f_w.write(res.content)print('progress: 30%')def rotate_pic(rotate, pic_path='before.jpg'):logger.info('rotate pic ...')print('progress: 45%')img = Image.open(pic_path)img1 = img.rotate(rotate, expand=True)logger.info('save rotated pic ...')img1.save('after.jpg')print('progress: 60%')def upload_file(file_path, local_file='after.jpg'):url = r""if not file_path.startswith('http'):file_path = url + '?path=' + file_pathfile = open(local_file, 'rb')logger.info('upload file ...')print('progress: 80%')querystring = {"path": file_path.split('=')[-1]}response = requests.post(url=url, data=file.read(), headers={'Content-Type': 'text/xml'}, params=querystring)if response.status_code == 200 and response.json().get('retcode', None) == '000000':logger.info('upload success!')print('progress: 100%')else:logger.error(f'upload failed!')print('progress: 0%')def deal_pic(source_page_url, rotate, save_tmp_file=False):"""处理角度异常的图片:param source_page_url: 原图地址:param rotate: 旋转角度,逆时针旋转:param save_tmp_file: 是否保存临时文件:return:"""try:download_src(source_page_url)rotate_pic(rotate)upload_file(source_page_url)if not save_tmp_file:os.remove('before.jpg')os.remove('after.jpg')except Exception as e:logger.error(e)if __name__ == '__main__':deal_pic(r'/test/5db9bca31775476cbxxxxx11f018ea9/cf0907bf6e9adxxxxx90f35a278c9e41.jpg',180)

运行

打包成执行文件

打包文件太大?

  • 原因:打包用的解释器是conda的环境,里面包含了非当前脚本用到的第三方库

  • 解决办法:使用新的环境来打包文件,新的环境只安装脚本需要的库

    • 创建新环境

      我这里采用的是virtualenv管理环境,直接创建一个新环境

      D:\ProgramData\virtualenvs>virtualenv -p "C:\Users\wjlv4\AppData\Local\Programs\Python\Python39-32\python.exe" tmp_env
      created virtual environment CPython3.9.5.final.0-32 in 2517mscreator CPython3Windows(dest=D:\ProgramData\virtualenvs\tmp_env, clear=False, no_vcs_ignore=False, global=False)seeder FromAppData(download=False, pip=bundle, setuptools=bundle, wheel=bundle, via=copy, app_data_dir=C:\Users\wjlv4\AppData\Local\pypa\virtualenv)added seed packages: pip==21.3.1, setuptools==59.4.0, wheel==0.37.0activators BashActivator,BatchActivator,FishActivator,NushellActivator,PowerShellActivator,PythonActivatorD:\ProgramData\virtualenvs>

      切换项目的解释器到新虚拟环境,可以看到新的虚拟环境没有任何外部库。

    • 本地执行脚本,查看缺少哪些依赖包,分别安装上

      pip install Pillow requests pandas loguru gooey
      
    • 在当前的虚拟环境使用pyinstaller打包*(命令可以直接用刚才打包的命令)*

      依赖安装完毕后,在虚拟环境安装pyinstaller之后,直接复制命令执行即可:

      pyinstaller --noconfirm --onedir --windowed --icon "D:/abk.ico" --name "脚本的标题" --clean --key "1231a" --add-data "D:/t1/fun;fun/"  "D:/t1/main.py"
      
    • 查看打包后的文件

    明显减少了很多。

更多推荐

py打包工具

本文发布于:2024-03-13 01:59:16,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1732930.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:工具   py

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!