python学习教程之使用py2exe打包
前言
本文主要给大家介绍了关于python使用py2exe打包的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。
遇坑
之前经过折腾,pyinstaller打包文件可以在别的windows7上运行。但是,mfk,客户说是xp系统。崩溃
使用pyinstaller各种折腾,打包出来的依然是不是有效的win32程序,各种报错。
后来尝试使用py2exe打包
使用
1、安装不废话,下载exe版,傻瓜式安装
2、使用
编写类似一个setup.py文件,写各种配置(下边有)
调用命令
pythonsetup.pypy2exe
或者在setup.py下添加如下语句,点击文件自动运行
sys.argv.append('py2exe')
官方示例:http://www.py2exe.org/index.cgi/Tutorial
具体参数含义见:http://www.py2exe.org/index.cgi/ListOfOptions
问题
1、不是有效的win32程序
换32位的python,其他模块都重装,包括pyqt5
2、py2exeUnicodeDecodeError:'gbk'codeccan'tdecode
py2exe的runtime.py里打开文件制定为utf-8
withopen(target.script,"U",encoding="UTF-8")asscript_file:
3、编译PyQt5异常
把一句Exception,e该为Exceptionase就好了
4、couldnotfindorloadtheQtplatformplugin"windows"
把C:\Python34\Lib\site-packages\PyQt5\plugins下的platforms拷贝到打包目录下的platforms搞定
5、找不到msvc**100.dll问题
把system32目录下的msvc**.dll的三个dll文件拷贝到打包目录下
分享一下完成的打包脚本
fromdistutils.coreimportsetup
importpy2exe
importsys
importos
importglob
importshutil
importmsvcrt
#thisallowstorunitwithasimpledoubleclick.
sys.argv.append('py2exe')
PYTHON_HOME=os.getenv('PYTHON_HOME')
TARGET_DIR='../build2'
#删除原来生成的路径
ifos.path.exists(TARGET_DIR):
print("是否删除文件夹(y/n)\t"+os.path.abspath(TARGET_DIR))
d=msvcrt.getch()
ifd==b'y':
shutil.rmtree(TARGET_DIR)
print(os.path.abspath(TARGET_DIR)+'被删除')
deffind_data_files(dlist,source,target,patterns):
#是否有特殊符号
ifglob.has_magic(source)orglob.has_magic(target):
raiseValueError("Magicnotallowedinsrc,target")
ret=dlist
forpatterninpatterns:
#给pattern上添加目录
pattern=os.path.join(source,pattern)
#通过pattern寻找满足条件的文件
forfilenameinglob.glob(pattern):
#判断文件是否存在
ifos.path.isfile(filename):
#获取相对source的相对路径
relP=os.path.relpath(filename,source)
#设置为目标路径
targetpath=os.path.join(target,relP)
#获取目标文件的文件夹
path=os.path.dirname(targetpath)
ret.setdefault(path,[]).append(filename)
print('-------------------')
print('资源拷贝')
data_files={}
#拷贝xp需要的msvc**100.dll
find_data_files(data_files,'C:/Windows/System32/','',['msvc*100.dll'])
#拷贝pyqt5里依赖的dll
find_data_files(data_files,PYTHON_HOME+'/Lib/site-packages/PyQt5/plugins/platforms','platforms',['*.dll'])
#把当前目录下ui文件夹内容拷贝到目标文件夹的ui文件夹下
find_data_files(data_files,'ui','ui',['*.*'])
#拷贝配置文件
find_data_files(data_files,'config/','config/',['*.*'])
#转成键值对集合
data_files=data_files.items()
print(data_files)
print('--------------------------')
OPTIONS={
'py2exe':{
"includes":["sip"],#导入依赖sip
#"dll_excludes":["MSVCP90.dll","MSVCR100.dll"],
#是否压缩1压缩。0不压缩
"compressed":1,
#优化级别。0不优化pyc1优化pyd2pyo
"optimize":2,
#依赖的包
"packages":["xml.etree","xml"],
#是否把dll打包到压缩包里
#1所有的都打包2除了python解释器,其他的都打包3所有的不打包
"bundle_files":1,
#生成的文件夹
'dist_dir':TARGET_DIR
},
}
setup(
name='登录器',
version='1.0',
#需要生成exe文件的py。因为可能会有多个入口
windows=[
{
'script':'Login.py',
#图标前的索引依赖ico里的图标数
"icon_resources":[(0,"ui/icon.ico")]
}
],
data_files=data_files,
options=OPTIONS,
#默认生成一个library.zip用来存放打包数据。如果设置为None,则打包数据存放在exe文件里
zipfile=None,
)
print("打包结束,按任意键退出..")
msvcrt.getch()
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。