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高效编程技巧
Jan 07 Python
python实现进程间通信简单实例
Jul 23 Python
Python使用ntplib库同步校准当地时间的方法
Jul 02 Python
python处理按钮消息的实例详解
Jul 11 Python
Django如何实现内容缓存示例详解
Sep 24 Python
使用python3构建文件传输的方法
Feb 13 Python
Python 隐藏输入密码时屏幕回显的实例
Feb 19 Python
python的sorted用法详解
Jun 25 Python
Python基本类型的连接组合和互相转换方式(13种)
Dec 16 Python
Python3之外部文件调用Django程序操作model等文件实现方式
Apr 07 Python
Python3 selenium 实现QQ群接龙自动化功能
Apr 17 Python
python 读取二进制 显示图片案例
Apr 24 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音乐采集(部分代码)
2007/02/14 PHP
ThinkPHP调用common/common.php函数提示错误function undefined的解决方法
2014/08/25 PHP
PHP连接MySQL数据的操作要点
2015/03/20 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
Extjs4 关于Store的一些操作(加载/回调/添加)
2013/04/18 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
配置Grunt的Task时通配符支持和动态生成文件名问题
2015/09/06 Javascript
JS实现浏览器状态栏显示时间的方法
2015/10/27 Javascript
jQuery 1.9.1源码分析系列(十五)动画处理之缓动动画核心Tween
2015/12/03 Javascript
详解Vue使用命令行搭建单页面应用
2017/05/24 Javascript
JS奇技之利用scroll来监听resize详解
2017/06/15 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
Angular5集成eventbus的示例代码
2018/07/19 Javascript
基于Vue 撸一个指令实现拖拽功能
2019/10/09 Javascript
vue项目或网页上实现文字转换成语音播放功能
2020/06/09 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
2020/08/25 Javascript
vue 监听 Treeselect 选择项的改变操作
2020/08/31 Javascript
搭建Python的Django框架环境并建立和运行第一个App的教程
2016/07/02 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
如何以Winsows Service方式运行JupyterLab
2020/08/30 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
彻底解决pip下载pytorch慢的问题方法
2021/03/01 Python
详解CSS3 弹性布局快速入门
2019/06/06 HTML / CSS
css 省略号 css3让多余的字符串消失并附加省略号的实现代码
2013/02/07 HTML / CSS
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
Tory Burch英国官方网站:美国时尚生活品牌
2017/12/06 全球购物
业务主管岗位职责范本
2013/12/25 职场文书
反腐倡廉观后感
2015/06/08 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
创业计划书之都市休闲农庄
2019/12/28 职场文书
springboot新建项目pom.xml文件第一行报错的解决
2022/01/18 Java/Android
win11系统中dhcp服务异常什么意思? Win11 DHCP服务异常修复方法
2022/04/08 数码科技
Win10 最新稳定版本 21H2开始推送
2022/04/19 数码科技
React自定义hook的方法
2022/06/25 Javascript