使用pyinstaller和pyqt进行Python程序的打包
建议大家每次开发新项目的时候一定要使用新的环境,进行环境隔离,避免打的包越来越大。
一、基础打包——pyinstaller
1. 简单使用
示例Python代码
1 | print('欢迎使用智能助手!') |
打包命令:
1 | # 首先安装 |
-D
打包,但是会把所有的文件都列出来,不会合并成一个文件,多文件的形式。
2. 打包出错问题或者闪现
如果程序出现问题,那么就把程序拖到终端,也就是在终端运行可执行文件。
3. 单文件和路径的问题
打包成单文件:
1 | pyinstaller -F xxx.py |
结构如下:
1 | ├── dist |
那么如何改名呢?使用-n xxx名字
,也就是 pyinstaller -F start.py -n 小帮手
1 | ├── dist |
但是对于单文件来说如果有配置文件呢,如何处理?
首先使用相对路径,执行会报错。然后使用绝对路径还是报错。
1 | import os |
会提示如下的报错:
1 | Traceback (most recent call last): |
可以理解成代码需要解压,放到了系统的临时目录,之后再运行程序。所以配置文件放在程序的边上是没有用的。
打包成单文件的时候读取文件时,路径会出现问题。那么怎么办呢,有两种方式。
方式一 sys.argv
sys.argv
获取当前程序所在的目录,将配置文件复制到dist目录下。
1 | print(sys.argv) |
所以一般使用sys.argv[0]
整体代码:
1 | import os |
但是需要注意,如果是使用命令行路径的方式执行程序的话,就有可能找不到文件,取决于运行代码过程中输入的目录不同导致获取的路径变成相对路径。解决方式就是全部处理成绝对路径。
1 | base_dir = os.path.dirname(os.path.realpath(sys.argv[0])) |
输出:
1 | ➜ GoodTools ./dist/小帮手 |
这样就会所有的路径都变成了绝对路径,更为稳妥。
方式二 frozen
增加判断条件,逻辑是判断代码打开还是pyinstaller打开。
1 | import os |
3. configparser的使用
1 | import configparser |
5. 动态导入
首先新建一个模块:
1 | # 创建 utils/encrypt.py |
1 | import os |
另外一种导入模式——import_module:
1 | import os |
但是这种导入就会报错。
解决方式,修改hiddenimports
增加上方法路径
1 | a = Analysis( |
但是打包的时候要换个执行方式,不要加-F
:
1 | pyinstaller xxxx.spec |
这种方式的优点是可以使代码更简洁。
二、Pyqt
示例一
拆分:
- 首先观察整体是一个大的垂直的layout,其他的layout往里添加
- 头部,水平的一个layout,两个按钮后增加一个弹簧挤压到最左边
- 表单的layout,一个输入框和按钮
- 表格的layout,要配置表格的headers
- footer的layout,左边是个label,然后弹簧,之后再若干按钮
初步使用
1 | import sys |
示例二
layout其实是不可见的,效果图:
代码如下:
1 | import sys |
三、价格监测工具
1. 添加监控项
- 点击添加绑定事件
- 获取文本信息
- 商品ID、概要、价格、频率、状态
- 添加到页面表格
- 状态(初始化)【待检测】【检测中】【完成并提醒】【初始化失败】【异常并停止】
- 持久化