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实现代码行数统计示例分享
Feb 10 Python
python查找目录下指定扩展名的文件实例
Apr 01 Python
Python的for和break循环结构中使用else语句的技巧
May 24 Python
Python处理XML格式数据的方法详解
Mar 21 Python
Python深度优先算法生成迷宫
Jan 22 Python
Python实现定时自动关闭的tkinter窗口方法
Feb 16 Python
Python面向对象程序设计类的封装与继承用法示例
Apr 12 Python
在SQLite-Python中实现返回、查询中文字段的方法
Jul 17 Python
Python获取对象属性的几种方式小结
Mar 12 Python
python怎么调用自己的函数
Jul 01 Python
python通过函数名调用函数的几种方法总结
Jun 07 Python
Python线程池与GIL全局锁实现抽奖小案例
Apr 13 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/04/28 PHP
php与java通过socket通信的实现代码
2013/10/21 PHP
php读取目录及子目录下所有文件名的方法
2014/10/20 PHP
PHP 生成N个不重复的随机数
2015/01/21 PHP
linux下实现定时执行php脚本
2015/02/13 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
PHP GD库相关图像生成和处理函数小结
2016/09/30 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
JS代码实现百度地图 画圆 删除标注
2016/10/12 Javascript
基于JS实现翻书效果的页面切换样式
2017/02/16 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
js装饰设计模式学习心得
2018/02/17 Javascript
浅谈vue 单文件探索
2018/09/05 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
JavaScript代理模式原理与用法实例详解
2020/03/10 Javascript
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
Python中bisect的使用方法
2019/12/31 Python
Python 获取异常(Exception)信息的几种方法
2020/12/29 Python
css图标制作教程制作云图标
2014/01/19 HTML / CSS
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
如何在C# winform中异步调用web services
2015/09/21 面试题
保送生自荐信范文
2013/10/06 职场文书
会计顶岗实习心得
2014/01/25 职场文书
2014年寒假社会实践活动心得体会
2014/04/07 职场文书
大学生个人求职信例文
2014/07/07 职场文书
工作自我评价范文
2015/03/05 职场文书
三八节活动简报
2015/07/20 职场文书
咖啡厅里的创业计划书
2019/08/21 职场文书
导游词之寿县报恩寺
2020/01/19 职场文书
pytorch finetuning 自己的图片进行训练操作
2021/06/05 Python
浅谈Python从全局与局部变量到装饰器的相关知识
2021/06/21 Python
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL
服务器nginx权限被拒绝解决案例
2022/09/23 Servers