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实现baidu hi自动登录的代码
Feb 10 Python
python实现rest请求api示例
Apr 22 Python
Python函数中定义参数的四种方式
Nov 30 Python
Go语言基于Socket编写服务器端与客户端通信的实例
Feb 19 Python
python实现批量修改文件名代码
Sep 10 Python
Win7 64位下python3.6.5安装配置图文教程
Oct 27 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
python中import与from方法总结(推荐)
Mar 21 Python
学习和使用python的13个理由
Jul 30 Python
基于spring boot 日志(logback)报错的解决方式
Feb 20 Python
Python入门之使用pandas分析excel数据
May 12 Python
python机器学习Github已达8.9Kstars模型解释器LIME
Nov 23 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实现异步调用方法研究与分享
2011/10/27 PHP
PHP函数microtime()用法与说明
2013/12/04 PHP
php环境无法上传文件的解决方法
2014/04/30 PHP
PHP从零开始打造自己的MVC框架之入口文件实现方法详解
2019/06/03 PHP
php基于 swoole 实现的异步处理任务功能示例
2019/08/13 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
javascript与有限状态机详解
2014/05/08 Javascript
javascript判断变量是否有值的方法
2015/04/20 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
2016/11/21 Javascript
bootstrap table分页模板和获取表中的ID方法
2017/01/10 Javascript
jquery表单验证插件validation使用方法详解
2017/01/20 Javascript
nodejs根据ip数组在百度地图中进行定位
2017/03/06 NodeJs
JS数组操作中的经典算法实例讲解
2017/07/26 Javascript
vue+swiper实现侧滑菜单效果
2017/12/28 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
vue中destroyed方法的使用说明
2020/07/21 Javascript
解决vant的Toast组件时提示not defined的问题
2020/11/11 Javascript
深入了解Vue3模板编译原理
2020/11/19 Vue.js
python 获取et和excel的版本号
2009/04/09 Python
Python中super的用法实例
2015/05/28 Python
python三方库之requests的快速上手
2019/03/04 Python
Python数据库小程序源代码
2019/09/15 Python
PyQt5中QTableWidget如何弹出菜单的示例代码
2020/02/23 Python
Python使用windows设置定时执行脚本
2020/11/12 Python
详解三种方式实现平滑滚动页面到顶部的功能
2019/04/23 HTML / CSS
一加手机美国官方网站:OnePlus美国
2019/09/19 全球购物
小学教师培训感言
2014/02/11 职场文书
运动会入场词50字
2014/02/20 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
优秀教师自我评价范文
2014/09/27 职场文书
春节慰问信范文
2015/02/15 职场文书
MySQL 重命名表的操作方法及注意事项
2021/05/21 MySQL