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程序中解析并修改XML内容的方法
Nov 16 Python
Python 提取dict转换为xml/json/table并输出的实现代码
Aug 28 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
python使用sqlite3时游标使用方法
Mar 13 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Python 实现异步调用函数的示例讲解
Oct 14 Python
我用Python抓取了7000 多本电子书案例详解
Mar 25 Python
Python实现自动访问网页的例子
Feb 21 Python
python 爬虫 实现增量去重和定时爬取实例
Feb 28 Python
django ListView的使用 ListView中获取url中的参数值方式
Mar 27 Python
Python find()、rfind()方法及作用
Dec 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和jquery实现地图区域数据统计展示数据示例
2014/02/12 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
PHP中变量引用与变量销毁机制分析
2014/11/15 PHP
php等比例缩放图片及剪切图片代码分享
2016/02/13 PHP
php二维数组按某个键值排序的实例讲解
2019/02/15 PHP
Centos7 Yum安装PHP7.2流程教程详解
2019/07/02 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
javascript 面向对象编程 聊聊对象的事
2009/09/17 Javascript
JS定义回车事件(实现代码)
2013/07/08 Javascript
通过jquery 获取URL参数并进行转码
2014/08/18 Javascript
学习JavaScript设计模式之代理模式
2016/01/12 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
js+canvas实现滑动拼图验证码功能
2018/03/26 Javascript
vue-quill-editor富文本编辑器简单使用方法
2018/09/21 Javascript
node.js express框架简介与实现
2019/07/23 Javascript
JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
2019/09/03 jQuery
javascript自定义右键菜单插件
2019/12/16 Javascript
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
2015/08/10 Python
python中os模块详解
2016/10/14 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
pymongo中group by的操作方法教程
2019/03/22 Python
Python常见数据类型转换操作示例
2019/05/08 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
pycharm修改文件的默认打开方式的步骤
2019/07/29 Python
Django中文件上传和文件访问微项目的方法
2020/04/27 Python
Canal官网:巴西女性时尚品牌
2019/10/16 全球购物
双立人加拿大官网:Zwilling加拿大
2020/08/10 全球购物
机械系大学毕业生推荐信
2013/11/27 职场文书
学年自我鉴定
2014/01/16 职场文书
《油菜花开了》教学反思
2014/02/22 职场文书
2014年巴西世界杯口号
2014/06/05 职场文书
捐书仪式主持词
2015/07/04 职场文书
CSS 实现Chrome标签栏的技巧
2021/08/04 HTML / CSS
IIS服务器中设置HTTP重定向访问HTTPS
2022/04/29 Servers