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')
官方示例: http://www.py2exe.org/index.cgi/Tutorial
具体参数含义见:http://www.py2exe.org/index.cgi/ListOfOptions
问题
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()
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。
- [接口测试 - http.client篇] 16 基于http.client之POM实战一下
- 数论部分第一节:素数与素性测试【详解】
- ProtoBuf 序列化工具组件
- C++STL vector简单使用练习1
- 小解Redis 系列
- 小侃 SQL加密和性能
- 接口测试 | 25 requests + pytest测试实例
- 接口测试 | 24 requests + unittest集成你的接口测试
- 接口测试 23 requests基础入门二
- 写让别人能读懂的代码+网页性能管理详解
- CDOJ 1330 柱爷与远古法阵【高斯消元,卡精度】
- Robot Framework | 04 参数化基于Public API的RFS测试
- 接口测试 | 22 requests基础入门
- 分享一个Mvc的多层架构,欢迎大家拍砖斧正
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 分享 OWIN 静态文件处理中间件
- Android-Jetpack笔记-Paging结合网络数据
- 在 VS 2015 中使用 Gulp 编译 TypeScript
- Android-Jetpack笔记-WorkManager
- Android | Tangram动态页面之路(一)需求背景
- 吐槽 Micorsoft.Owin 的设计
- Android | Tangram动态页面之路(二)介绍
- 使用 ng-repeat-start 进行自定义显示
- AngularJS 多视图应用中的登录认证
- Android | Tangram动态页面之路(三)使用
- Android | Tangram动态页面之路(四)vlayout原理
- 基于QuestaSIM的SystemVerilog DPI使用流程(step by step)
- Android | Tangram动态页面之路(五)Tangram原理
- Android | Tangram动态页面之路(六)数据分离
- 在 mono 下使用微软的 OWIN 认证中间件