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二分法实现实例
Nov 21 Python
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
python使用ctypes模块调用windowsapi获取系统版本示例
Apr 17 Python
Python实现获取操作系统版本信息方法
Apr 08 Python
Python实现列表转换成字典数据结构的方法
Mar 11 Python
django实现前后台交互实例
Aug 07 Python
Python编程实现微信企业号文本消息推送功能示例
Aug 21 Python
Python中django学习心得
Dec 06 Python
Python使用sorted对字典的key或value排序
Nov 15 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
Django设置Postgresql的操作
May 14 Python
Python离线安装各种库及pip的方法
Nov 28 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
Protoss兵种对照表
2020/03/14 星际争霸
vs中通过剪切板循环来循环粘贴不同内容
2011/04/30 PHP
解析php中session的实现原理以及大网站应用应注意的问题
2013/06/17 PHP
php日期操作技巧小结
2016/06/25 PHP
laravel框架语言包拓展实现方法分析
2019/11/22 PHP
在Javascript中为String对象添加trim,ltrim,rtrim方法
2006/09/22 Javascript
JavaScript获取onclick、onchange等事件值的代码
2013/07/22 Javascript
Javascript异步编程模型Promise模式详细介绍
2014/05/08 Javascript
JS实现清除指定cookies的方法
2014/09/20 Javascript
JQuery中属性过滤选择器用法实例分析
2015/05/18 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
jQuery快速实现商品数量加减的方法
2017/02/06 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
2017/05/11 Javascript
微信小程序实现刷脸登录
2018/05/25 Javascript
node跨域转发 express+http-proxy-middleware的使用
2018/05/31 Javascript
JS数组求和的常用方法总结【5种方法】
2019/01/14 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
[55:35]VGJ.S vs Mski Supermajor小组赛C组 BO3 第二场 6.3
2018/06/04 DOTA
Python设计模式之单例模式实例
2014/04/26 Python
Python中Random和Math模块学习笔记
2015/05/18 Python
Python中if __name__ == '__main__'作用解析
2015/06/29 Python
python决策树之C4.5算法详解
2017/12/20 Python
python实现textrank关键词提取
2018/06/22 Python
django自定义非主键自增字段类型详解(auto increment field)
2020/03/30 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
一款恶搞头像特效的制作过程 利用css3和jquery
2014/11/21 HTML / CSS
HTML5本地存储之Database Storage应用介绍
2013/01/06 HTML / CSS
捷克街头、运动和滑板一站式商店:BoardStar.cz
2019/10/06 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
小马王观后感
2015/06/11 职场文书
2016学习全国教书育人楷模先进事迹心得体会
2016/01/21 职场文书
护理工作心得体会
2016/01/22 职场文书
小学英语课教学反思
2016/02/15 职场文书