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 相关文章推荐
浅谈终端直接执行py文件,不需要python命令
Jan 23 Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 Python
Python numpy实现数组合并实例(vstack,hstack)
Jan 09 Python
pandas修改DataFrame列名的方法
Apr 08 Python
centos7之Python3.74安装教程
Aug 15 Python
关于tf.reverse_sequence()简述
Jan 20 Python
使用 tf.nn.dynamic_rnn 展开时间维度方式
Jan 21 Python
解决使用python print打印函数返回值多一个None的问题
Apr 09 Python
python 获取域名到期时间的方法步骤
Feb 10 Python
浅谈Python数学建模之线性规划
Jun 23 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 Python
PO模式在selenium自动化测试框架的优势
Mar 20 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开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
用Simple Excel导出xls实现方法
2012/12/06 PHP
PHP中将ip地址转成十进制数的两种实用方法
2013/08/15 PHP
老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略
2016/03/20 PHP
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
解析Javascript中中括号“[]”的多义性
2013/12/03 Javascript
js实现倒计时时钟的示例代码
2013/12/17 Javascript
利用jQuary实现文字浮动提示效果示例代码
2013/12/26 Javascript
JS实现将人民币金额转换为大写的示例代码
2014/02/13 Javascript
js动态往表格的td中添加图片并注册事件
2014/06/12 Javascript
node.js中的fs.appendFileSync方法使用说明
2014/12/17 Javascript
TypeError document.getElementById(...) is null错误原因
2015/05/18 Javascript
javascript控制台详解
2015/06/25 Javascript
AngularJS实现Model缓存的方式
2016/02/03 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
jQuery Form表单取值的方法
2017/01/11 Javascript
JS实现select选中option触发事件操作示例
2018/07/13 Javascript
在layui中layer弹出层点击事件无效的解决方法
2019/09/05 Javascript
js Math数学简单使用操作示例
2020/03/13 Javascript
[03:17]2014DOTA2 国际邀请赛中国区预选赛 四强专访
2014/05/23 DOTA
django实现前后台交互实例
2017/08/07 Python
基于循环神经网络(RNN)实现影评情感分类
2018/03/26 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
Python实现统计给定字符串中重复模式最高子串功能示例
2018/05/16 Python
Python3.5装饰器原理及应用实例详解
2019/04/30 Python
Python 输出详细的异常信息(traceback)方式
2020/04/08 Python
python实现飞船大战
2020/04/24 Python
15款Python编辑器的优缺点,别再问我“选什么编辑器”啦
2020/10/19 Python
python爬虫快速响应服务器的做法
2020/11/24 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
PHP数据运算类型都有哪些
2013/11/05 面试题
高中课前三分钟演讲稿
2014/09/13 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
创业计划书详解
2019/07/19 职场文书
Mysql中常用的join连接方式
2022/05/11 MySQL