python GUI库图形界面开发之pyinstaller打包python程序为exe安装文件
本文介绍一个exe打包工具pyinstaller,使用非常简单、方便,而且还跨平台。
软硬件环境
- Windows1064bit
- PyQt5
- Anacondawithpython3.6.5
- pyinstaller
- apscheduler
- sqlalchemy
pyinstaller安装
命令行中执行
pipinstallpyinstaller
pyinstaller打包exe
示例还是以之前的为例,解压进入工程目录,命令行执行打包命令
pyinstaller-F--distpathreleasemain.py
其中release是目标文件夹,main.py是工程入口文件,-F表示生成一个可执行文件。
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--distpathreleasemain.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打包的时候,出现了如下错误
解决方法是,编辑文件/usr/local/lib/python3.5/dist-packages/apscheduler/__init__.py
#ThesewillberemovedinAPScheduler4.0.
#release=__import__('pkg_resources').get_distribution('APScheduler').version.split('-')[0]
#version_info=tuple(int(x)ifx.isdigit()elsexforxinrelease.split('.'))
#version=__version__='.'.join(str(x)forxinversion_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-*- fromPyInstaller.utils.hooksimportcopy_metadata datas=copy_metadata('apscheduler')
最后执行打包命令
pyinstaller-F--clean--additional-hooks-dirhooks--distpathreleasemain.py
sqlalchemy打包问题
在用pyinstaller打包一个使用了sqlalchemy库的python3工程中,碰到了打包后的可执行文件报错的问题,如下图所示
解决方案是,将sqlalchemy.dialects中的mysql引入,然后采用mysql+pymysql的方式打开数据库,代码如下
importpymysql fromsqlalchemyimportcreate_engine fromsqlalchemy.ormimportsessionmaker fromsqlalchemy.dialectsimportmysql 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--distpathsharkmain.py
好了,至此pyinstaller打包python程序为exe安装文件的其实操作就算完成了,如果出现其它问题请直接联系我们,更多关于这方面的相关知识请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。