python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件


Posted in Python onFebruary 26, 2020

本文介绍一个exe打包工具pyinstaller,使用非常简单、方便,而且还跨平台。

软硬件环境

  • Windows 10 64bit
  • PyQt5
  • Anaconda with python 3.6.5
  • pyinstaller
  • apscheduler
  • sqlalchemy

pyinstaller安装

命令行中执行

pip install pyinstaller

pyinstaller打包exe

示例还是以之前的为例,解压进入工程目录,命令行执行打包命令

pyinstaller -F --distpath release main.py

其中release是目标文件夹,main.py是工程入口文件,-F表示生成一个可执行文件。

python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

pyinstaller的打包参数很多,需要的话通过help来查看

pyinstaller -h

subprocess打包问题

在打包包含subprocess.Popen时发现,加上参数--noconsole时产生的exe文件在运行的时候,进程并没有正确运行。比如需要利用subprocess.Popen创建一个进程去执行一个命令行操作,

mProcess = subprocess.Popen(cmd,stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True)

pyinstaller打包操作命令如下

pyinstaller -F --noconsole --clean --distpath release main.py

打包后生成的exe,可以运行,不过查看进程并没有如预期正确地工作。

解决方法是在创建进程时,加上startupinfo参数,如下

si = subprocess.STARTUPINFO()

si.dwFlags |= subprocess.STARTF_USESHOWWINDOW

mProcess = subprocess.Popen(cmd,stdin=subprocess.DEVNULL, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,universal_newlines=True,startupinfo=si)

问题完美解决,具体可以参考文末的资料

apscheduler打包问题

项目中用到了apscheduler这个库,用来做定时任务非常的好,使用也很简单,不过在pyinstaller打包的时候,出现了如下错误

python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

解决方法是,编辑文件/usr/local/lib/python3.5/dist-packages/apscheduler/__init__.py

# These will be removed in APScheduler 4.0.

# release = __import__('pkg_resources').get_distribution('APScheduler').version.split('-')[0]

# version_info = tuple(int(x) if x.isdigit() else x for x in release.split('.'))

# version = __version__ = '.'.join(str(x) for x in version_info[:3])

release = (3,3,1) 

version_info = '3.3.1' 

version = '3.3.1'

3.3.1是我安装的apscheduler的版本号,视实际情况修改。

接下来创建一个名称为hook-ctypes.macholib.py,内容如下

# -*- coding: utf-8 -*-

from PyInstaller.utils.hooks import copy_metadata

datas = copy_metadata('apscheduler')

最后执行打包命令

pyinstaller -F --clean --additional-hooks-dir hooks --distpath release main.py

sqlalchemy打包问题

在用pyinstaller打包一个使用了sqlalchemy库的python3工程中,碰到了打包后的可执行文件报错的问题,如下图所示

python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件

解决方案是,将sqlalchemy.dialects中的mysql引入,然后采用mysql+pymysql的方式打开数据库,代码如下

import pymysql

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.dialects import mysql

username = 'xugaoxiang'
passwd = '123456'
server = '192.168.0.100'
port = '3306'
dbname = 'djdb'

cmd_connect = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(username, passwd, server, port, dbname)

engine = create_engine(cmd_connect)

执行pyinstaller打包命令

pyinstaller -F --clean --distpath shark main.py

好了,至此pyinstaller打包python程序为exe安装文件的其实操作就算完成了,如果出现其它问题请直接联系我们,更多关于这方面的相关知识请查看下面的相关链接

Python 相关文章推荐
python 查找文件夹下所有文件 实现代码
Jul 01 Python
Python 第一步 hello world
Sep 25 Python
python生成随机mac地址的方法
Mar 16 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
Python编程之变量赋值操作实例分析
Jul 24 Python
python删除某个字符
Mar 19 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
Jun 27 Python
Python底层封装实现方法详解
Jan 22 Python
Django Serializer HiddenField隐藏字段实例
Mar 31 Python
PyQt5实现登录页面
May 30 Python
Django REST 异常处理详解
Jul 15 Python
python实现数字炸弹游戏
Jul 17 Python
python GUI库图形界面开发之PyQt5中QWebEngineView内嵌网页与Python的数据交互传参详细方法实例
Feb 26 #Python
python自动点赞功能的实现思路
Feb 26 #Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 #Python
python GUI库图形界面开发之PyQt5窗口控件QWidget详细使用方法
Feb 26 #Python
python GUI库图形界面开发之PyQt5窗口类QMainWindow详细使用方法
Feb 26 #Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 #Python
python实现全排列代码(回溯、深度优先搜索)
Feb 26 #Python
You might like
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
zf框架的session会话周期及次数限制使用示例
2014/03/13 PHP
php使用GeoIP库实例
2014/06/27 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
2015/07/02 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
javascript页面渲染速度测试脚本分享
2014/04/15 Javascript
利用js制作html table分页示例(js实现分页)
2014/04/25 Javascript
13 款最热门的 jQuery 图像 360 度旋转插件推荐
2014/12/09 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
angularJs关于指令的一些冷门属性详解
2016/10/24 Javascript
js格式化时间的简单实例
2016/11/27 Javascript
canvas实现弧形可拖动进度条效果
2017/05/11 Javascript
详解VueJs前后端分离跨域问题
2017/05/24 Javascript
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
浅谈Angular文字折叠展开组件的原理分析
2017/11/24 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
2017/12/15 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
[10:54]Team Spirit vs Navi
2018/06/07 DOTA
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python学习必备知识汇总
2017/09/08 Python
Python用 KNN 进行验证码识别的实现方法
2018/02/06 Python
python实现换位加密算法的示例
2018/10/14 Python
Pycharm中切换pytorch的环境和配置的教程详解
2020/03/13 Python
Python实现Wordcloud生成词云图的示例
2020/03/30 Python
将keras的h5模型转换为tensorflow的pb模型操作
2020/05/25 Python
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
美体小铺美国官网:The Body Shop美国
2017/11/10 全球购物
学生会个人自荐书范文
2014/02/12 职场文书
本科毕业生自荐信
2014/05/26 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
体育教师教学随笔
2015/08/15 职场文书
Redis实现订单自动过期功能的示例代码
2021/05/08 Redis