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 不同对象比较大小示例探讨
Aug 21 Python
深入浅析Python字符编码
Nov 12 Python
python中执行shell的两种方法总结
Jan 10 Python
Python爬虫包 BeautifulSoup  递归抓取实例详解
Jan 28 Python
Flask解决跨域的问题示例代码
Feb 12 Python
Python标准库shutil用法实例详解
Aug 13 Python
Python Matplotlib实现三维数据的散点图绘制
Mar 19 Python
python django中8000端口被占用的解决
Dec 17 Python
深入分析python 排序
Aug 24 Python
Python 利用Entrez库筛选下载PubMed文献摘要的示例
Nov 24 Python
python中Pexpect的工作流程实例讲解
Mar 02 Python
浅谈Python 中的复数问题
May 19 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
仿Aspnetpager的一个PHP分页类代码 附源码下载
2012/10/08 PHP
Laravel 5框架学习之子视图和表单复用
2015/04/09 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
PDO操作MySQL的基础教程(推荐)
2017/08/18 PHP
PHP封装的XML简单操作类完整实例
2017/11/13 PHP
BOOM vs RR BO3 第一场2.13
2021/03/10 DOTA
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
用jquery实现的模拟QQ邮箱里的收件人选取及其他效果(一)
2011/01/06 Javascript
js函数调用常用方法详解
2012/12/03 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
jquery关于事件冒泡和事件委托的技巧及阻止与允许事件冒泡的三种实现方法
2015/11/27 Javascript
jQuery中$.each()函数的用法引申实例
2016/05/12 Javascript
redux-saga 初识和使用
2018/03/10 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
[01:03:03]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第一场 8.22
2018/08/23 DOTA
python三元运算符实现方法
2013/12/17 Python
在Python的循环体中使用else语句的方法
2015/03/30 Python
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
python实现决策树分类
2018/08/30 Python
python查看数据类型的方法
2019/10/12 Python
python如何使用jt400.jar包代码实例
2019/12/20 Python
Pyecharts绘制全球流向图的示例代码
2020/01/08 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
全球速卖通巴西站点:Aliexpress巴西
2016/08/24 全球购物
KEEN美国官网:美国人气户外休闲鞋品牌
2021/03/09 全球购物
工作表现自我评价
2014/02/08 职场文书
小学班主任寄语大全
2014/04/04 职场文书
优秀学生干部先进事迹材料
2014/05/26 职场文书
党员创先争优心得体会
2014/09/11 职场文书
生活小常识广播稿
2015/08/19 职场文书
2015年物业管理员工工作总结
2015/10/15 职场文书
多人盗宝《绿林侠盗》第三赛季4.5上线 跨平台实装
2022/04/03 其他游戏