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的Socket编程过程中实现UDP端口复用的实例分享
Mar 19 Python
Python入门_浅谈字符串的分片与索引、字符串的方法
May 16 Python
Python实现购物系统(示例讲解)
Sep 13 Python
深入浅出学习python装饰器
Sep 29 Python
Python3.6 Schedule模块定时任务(实例讲解)
Nov 09 Python
Python使用itertools模块实现排列组合功能示例
Jul 02 Python
Python爬取qq空间说说的实例代码
Aug 17 Python
python traceback捕获并打印异常的方法
Aug 31 Python
Python Pillow Image Invert
Jan 22 Python
阿里云ECS服务器部署django的方法
Aug 29 Python
python编写简单端口扫描器
Sep 04 Python
django框架forms组件用法实例详解
Dec 10 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
第九节--绑定
2006/11/16 PHP
php 字符串函数收集
2010/03/29 PHP
php表单提交问题的解决方法
2011/04/12 PHP
php中取得文件的后缀名?
2012/02/20 PHP
php调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP curl伪造IP地址和header信息代码实例
2015/04/27 PHP
浅析php静态方法与非静态方法的用法区别
2016/05/17 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
javascript中数组和字符串的方法对比
2016/07/20 Javascript
js 提交form表单和设置form表单请求路径的实现方法
2016/10/25 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
ES6中Symbol、Set和Map用法详解
2019/08/20 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[01:03:41]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第三场 2月2日
2021/03/11 DOTA
Python入门篇之字符串
2014/10/17 Python
在Python中使用正则表达式的方法
2015/08/13 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
import的本质解析
2017/10/30 Python
python 生成图形验证码的方法示例
2018/11/11 Python
python自动化生成IOS的图标
2018/11/13 Python
Python检测数据类型的方法总结
2019/05/20 Python
Python动态声明变量赋值代码实例
2019/12/30 Python
Python3使用tesserocr识别字母数字验证码的实现
2021/01/29 Python
HTML5 form标签之解放表单验证、增加文件上传、集成拖放的使用方法
2013/04/24 HTML / CSS
酒店副总岗位职责
2013/12/24 职场文书
公司办公室岗位职责
2014/03/19 职场文书
小学教师自我鉴定范文
2014/03/20 职场文书
合唱兴趣小组活动总结
2014/07/10 职场文书
Java常用工具类汇总 附示例代码
2021/06/26 Java/Android
Python必备技巧之字符数据操作详解
2022/03/23 Python