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 03 Python
python将字符串转换成数组的方法
Apr 29 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
Jun 14 Python
Python中关于Sequence切片的下标问题详解
Jun 15 Python
python Socket之客户端和服务端握手详解
Sep 18 Python
python提取图像的名字*.jpg到txt文本的方法
May 10 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
在python 不同时区之间的差值与转换方法
Jan 14 Python
Python实现计算对象的内存大小示例
Jul 10 Python
python爬虫爬取网页数据并解析数据
Sep 18 Python
python基础学习之生成器与文件系统知识总结
May 25 Python
python数字图像处理:图像简单滤波
Jun 28 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
地摊中国 - 珍藏老照片
2020/08/18 杂记
PHP编程与应用
2006/10/09 PHP
PHP插入排序实现代码
2013/04/04 PHP
PHP+MySQL插入操作实例
2015/01/21 PHP
PHP的压缩函数实现:gzencode、gzdeflate和gzcompress的区别
2016/01/27 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
理解JavaScript中的事件
2006/09/23 Javascript
jQuery选择器的工作原理和优化分析
2011/07/25 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
让angularjs支持浏览器自动填表
2014/11/10 Javascript
js实现文字闪烁特效的方法
2015/12/17 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
AngularJs Scope详解及示例代码
2016/09/01 Javascript
js微信扫描二维码登录网站技术原理
2016/12/01 Javascript
AngularJS实现表单验证功能详解
2017/10/12 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
Vue CLI3中使用compass normalize的方法
2019/05/30 Javascript
bootstrap table实现横向合并与纵向合并
2019/07/18 Javascript
Vue中遍历数组的新方法实例详解
2019/07/21 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
Python3实现将文件树中所有文件和子目录归档到tar压缩文件的方法
2015/05/22 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
python实现稀疏矩阵示例代码
2017/06/09 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Pytorch入门之mnist分类实例
2018/04/14 Python
使用matplotlib画散点图的方法
2018/05/25 Python
浅谈Django中view对数据库的调用方法
2019/07/18 Python
英国运动风奢侈品购物网站:Maison De Fashion
2020/08/28 全球购物
人力资源专业推荐信
2013/11/29 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
介绍信怎么写
2015/05/05 职场文书
难以忽视的真相观后感
2015/06/05 职场文书
上甘岭观后感
2015/06/10 职场文书
航班延误投诉信
2015/07/02 职场文书
世界十大评分最高的动漫,CLANNAD上榜,第八赚足人们眼泪
2022/03/18 日漫