python学习教程之使用py2exe打包


Posted in Python onSeptember 24, 2017

前言

本文主要给大家介绍了关于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()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
rhythmbox中文名乱码问题解决方法
Sep 06 Python
利用python发送和接收邮件
Sep 27 Python
深入学习Python中的上下文管理器与else块
Aug 27 Python
今天 平安夜 Python 送你一顶圣诞帽 @微信官方
Dec 25 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
利用python list完成最简单的DB连接池方法
Aug 09 Python
Python 类的私有属性和私有方法实例分析
Sep 29 Python
Pytorch 搭建分类回归神经网络并用GPU进行加速的例子
Jan 09 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
Mar 30 Python
python实现取余操作的简单实例
Aug 16 Python
python实现图书馆抢座(自动预约)功能的示例代码
Sep 29 Python
python数据结构之列表和元组的详解
Sep 23 #Python
Python字符串和字典相关操作的实例详解
Sep 23 #Python
使用Turtle画正螺旋线的方法
Sep 22 #Python
详谈python read readline readlines的区别
Sep 22 #Python
Python实现针对含中文字符串的截取功能示例
Sep 22 #Python
Python实现二维数组按照某行或列排序的方法【numpy lexsort】
Sep 22 #Python
Python中列表list以及list与数组array的相互转换实现方法
Sep 22 #Python
You might like
PHP+MYSQL 出现乱码的解决方法
2008/08/08 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
Java和PHP在Web开发方面对比分析
2015/03/01 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
2011/03/03 Javascript
jquery ajax方式直接提交整个表单核心代码
2013/08/15 Javascript
javascript弹出层输入框(示例代码)
2013/12/11 Javascript
JavaScript中使用数组方法汇总
2016/02/16 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
JS动态生成年份和月份实例代码
2017/02/04 Javascript
nodejs中Express与Koa2对比分析
2018/02/06 NodeJs
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
基于p5.js 2D图像接口的扩展(交互实现)
2020/11/30 Javascript
[03:01]DOTA2英雄基础教程 露娜
2014/01/07 DOTA
[31:55]完美世界DOTA2联赛循环赛 IO vs GXR BO2第一场 11.04
2020/11/05 DOTA
pygame学习笔记(1):矩形、圆型画图实例
2015/04/15 Python
关于numpy中np.nonzero()函数用法的详解
2017/02/07 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
Python Django基础二之URL路由系统
2019/07/18 Python
python 类之间的参数传递方式
2019/12/20 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
解决tensorflow/keras时出现数组维度不匹配问题
2020/06/29 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
python中字符串的编码与解码详析
2020/12/03 Python
python中reload重载实例用法
2020/12/15 Python
智能室内花园:Click & Grow
2021/01/29 全球购物
学校对教师的评语
2014/04/28 职场文书
建设办主任四风问题整改思路和措施
2014/09/20 职场文书
村主任个人对照检查材料
2014/10/01 职场文书
加强作风建设工作总结
2014/10/23 职场文书