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基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
八大排序算法的Python实现
Jan 28 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
Python实现插入排序和选择排序的方法
May 12 Python
Python3内置模块之base64编解码方法详解
Jul 13 Python
pycharm修改文件的默认打开方式的步骤
Jul 29 Python
Python如何使用函数做字典的值
Nov 30 Python
tensorflow实现对张量数据的切片操作方式
Jan 19 Python
python随机模块random使用方法详解
Feb 14 Python
Python爬虫入门有哪些基础知识点
Jun 02 Python
python语言中pandas字符串分割str.split()函数
Aug 05 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
海河写的 Discuz论坛帖子调用js的php代码
2007/08/23 PHP
php设计模式之原型模式分析【星际争霸游戏案例】
2020/03/23 PHP
[转]JS宝典学习笔记
2007/02/07 Javascript
javascript 动态添加事件代码
2008/11/30 Javascript
一些常用的JS功能函数(2009-06-04更新)
2009/06/04 Javascript
jquery的ajax简单结构示例代码
2014/02/17 Javascript
javascript模拟post提交隐藏地址栏的参数
2014/09/03 Javascript
分享一款基于jQuery的视频播放插件
2014/10/09 Javascript
JavaScript实现基于Cookie的存储类实例
2015/04/10 Javascript
jquery移动端TAB触屏切换实现效果
2020/12/22 Javascript
BootStrap 智能表单实战系列(二)BootStrap支持的类型简介
2016/06/13 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
JavaScript判断变量名是否存在数组中的实例
2017/12/28 Javascript
AngularJS下$http服务Post方法传递json参数的实例
2018/03/29 Javascript
webpack4的迁移的使用方法
2018/05/25 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
微信小程序--获取用户地理位置名称(无须用户授权)的方法
2019/04/29 Javascript
vue中使用element组件时事件想要传递其他参数的问题
2019/09/18 Javascript
JS严格模式原理与用法实例分析
2020/04/27 Javascript
JavaScript用document.write()输出换行的示例代码
2020/11/26 Javascript
wxpython学习笔记(推荐查看)
2014/06/09 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
新手如何发布Python项目开源包过程详解
2019/07/11 Python
更新pip3与pyttsx3文字语音转换的实现方法
2019/08/08 Python
解决Python中回文数和质数的问题
2019/11/24 Python
基于python实现模拟数据结构模型
2020/06/12 Python
详解background属性的8个属性值(面试题)
2020/11/02 HTML / CSS
Linux面试经常问的文件系统操作命令
2016/10/04 面试题
会计毕业生自我鉴定
2013/11/04 职场文书
报社实习生自荐信
2014/01/24 职场文书
诚信考试倡议书
2014/04/15 职场文书
离退休人员聘用协议书
2014/11/24 职场文书
公务员岗前培训心得体会
2016/01/08 职场文书
golang正则之命名分组方式
2021/04/25 Golang