python学习教程之使用py2exe打包
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
python学习教程之使⽤py2exe打包
前⾔
本⽂主要给⼤家介绍了关于python使⽤py2exe打包的相关内容,分享出来供⼤家参考学习,下⾯话不多说了,来⼀起看看详细的介绍吧。
遇坑
之前经过折腾,pyinstaller打包⽂件可以在别的windows7上运⾏。
但是,mfk, 客户说是xp系统。
崩溃
使⽤pyinstaller各种折腾,打包出来的依然是不是有效的win32程序,各种报错。
后来尝试使⽤ py2exe 打包
使⽤
1、安装不废话,下载exe版,傻⽠式安装
2、使⽤
编写类似⼀个 setup.py ⽂件,写各种配置(下边有)
调⽤命令
python setup.py py2exe
或者在setup.py下添加如下语句,点击⽂件⾃动运⾏
sys.argv.append('py2exe')
问题
1、不是有效的win32程序
换32位的python,其他模块都重装,包括pyqt5
2、py2exe UnicodeDecodeError: 'gbk' codec can't decode
py2exe 的runtime.py ⾥打开⽂件制定为utf-8
with open(target.script, "U",encoding="UTF-8") as script_file:
3、编译PyQt5 异常
把⼀句 Exception, e 该为 Exception as e 就好了
4、could not find or load the Qt platform plugin "windows"
把 C:\Python34\Lib\site-packages\PyQt5\plugins 下的 platforms 拷贝到打包⽬录下的platforms搞定
5、找不到 msvc**100.dll 问题
把system32 ⽬录下的 msvc**.dll 的三个dll⽂件拷贝到打包⽬录下
分享⼀下完成的打包脚本
from distutils.core import setup
import py2exe
import sys
import os
import glob
import shutil
import msvcrt
#this allows to run it with a simple double click.
sys.argv.append('py2exe')
PYTHON_HOME = os.getenv('PYTHON_HOME')
TARGET_DIR = '../build2'
# 删除原来⽣成的路径
if os.path.exists(TARGET_DIR):
print("是否删除⽂件夹(y/n)\t" + os.path.abspath(TARGET_DIR))
d = msvcrt.getch()
if d == b'y':
shutil.rmtree(TARGET_DIR)
print(os.path.abspath(TARGET_DIR)+' 被删除')
def find_data_files(dlist,source,target,patterns):
# 是否有特殊符号
if glob.has_magic(source) or glob.has_magic(target):
raise ValueError("Magic not allowed in src, target")
ret = dlist
for pattern in patterns:
# 给pattern 上添加⽬录
pattern = os.path.join(source,pattern)
# 通过pattern寻找满⾜条件的⽂件
for filename in glob.glob(pattern):
# 判断⽂件是否存在
if os.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 不优化 pyc 1 优化 pyd 2 pyo
"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()
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。