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 相关文章推荐
python基础教程之lambda表达式使用方法
Feb 12 Python
python快速查找算法应用实例
Sep 26 Python
Python使用time模块实现指定时间触发器示例
May 18 Python
python3+mysql查询数据并通过邮件群发excel附件
Feb 24 Python
Python 使用 docopt 解析json参数文件过程讲解
Aug 13 Python
python 如何去除字符串头尾的多余符号
Nov 19 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
Python如何使用内置库matplotlib绘制折线图
Feb 24 Python
python pandas利用fillna方法实现部分自动填充功能
Mar 16 Python
使用python客户端访问impala的操作方式
Mar 28 Python
keras 实现轻量级网络ShuffleNet教程
Jun 19 Python
Python实现单例模式的5种方法
Jun 15 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超级全局变量数组小结
2012/10/04 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
修改Laravel5.3中的路由文件与路径
2016/08/10 PHP
PHP中16个高危函数整理
2019/09/19 PHP
Laravel 解决419错误 -ajax请求错误的问题(CSRF验证)
2019/10/25 PHP
妙用Jquery的val()方法
2012/06/27 Javascript
JQuery中SetTimeOut传参问题探讨
2013/05/10 Javascript
javascript实现存储hmtl字符串示例
2014/04/25 Javascript
javascript+canvas实现刮刮卡抽奖效果
2015/07/29 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
jQuery Easyui使用(二)之可折叠面板动态加载无效果的解决方法
2016/08/17 Javascript
用原生js做单页应用
2017/01/17 Javascript
BootStrap中jQuery插件Carousel实现轮播广告效果
2017/03/27 jQuery
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
使用Vuex解决Vue中的身份验证问题
2018/09/28 Javascript
浅谈Javascript常用正则表达式应用
2019/03/08 Javascript
微信小程序实现图片选择并预览功能
2019/07/25 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
vue-router定义元信息meta操作
2020/12/07 Vue.js
详解python中requirements.txt的一切
2017/03/03 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
python使用selenium实现批量文件下载
2019/03/11 Python
python图像和办公文档处理总结
2019/05/28 Python
python 怎样进行内存管理
2020/11/10 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
python 发送邮件的四种方法汇总
2020/12/02 Python
德国化妆品和天然化妆品网上商店:kosmetikfuchs.de
2017/06/09 全球购物
无畏的旅行:Intrepid Travel
2017/12/20 全球购物
Android面试宝典
2013/08/06 面试题
恐龙的灭绝教学反思
2014/02/12 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
2015年公民道德宣传日活动总结
2015/03/23 职场文书
学习弘扬焦裕禄精神心得体会
2016/01/23 职场文书
python 算法题——快乐数的多种解法
2021/05/27 Python