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实现socket端口重定向示例
Feb 10 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
Python合并字符串的3种方法
May 21 Python
python统计文本文件内单词数量的方法
May 30 Python
Python实现优先级队列结构的方法详解
Jun 02 Python
python3.6+django2.0开发一套学员管理系统
Mar 03 Python
pandas通过索引进行排序的示例
Nov 16 Python
python虚拟环境迁移方法
Jan 03 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
Python导入模块包原理及相关注意事项
Mar 25 Python
Pytorch中的学习率衰减及其用法详解
Jun 05 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
骨王战斗力在公会成员中排不进前五,却当选了会长,原因竟是这样
2020/03/02 日漫
php读取EXCEL文件 php excelreader读取excel文件
2012/12/06 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
2015/04/08 PHP
php文件上传你必须知道的几点
2015/10/20 PHP
Laravel关联模型中过滤结果为空的结果集(has和with区别)
2018/10/18 PHP
javascript 动态生成私有变量访问器
2009/12/06 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
JavaScript中的Math.SQRT1_2属性使用简介
2015/06/14 Javascript
基于JavaScript操作DOM常用的API小结
2015/12/01 Javascript
DOM事件探秘篇
2017/02/15 Javascript
Node.js获取前端ajax提交的request信息
2017/02/20 Javascript
JS 组件系列之 bootstrap treegrid 组件封装过程
2017/04/28 Javascript
JS实现快速比较两个字符串中包含有相同数字的方法
2017/09/11 Javascript
详解vue项目打包后通过百度的BAE发布到网上的流程
2018/03/05 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
Vue实现将数据库中带html标签的内容输出(原始HTML(Raw HTML))
2019/10/28 Javascript
基于JS实现快速读取TXT文件
2020/08/25 Javascript
python多线程抓取天涯帖子内容示例
2014/04/03 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
一文秒懂python读写csv xml json文件各种骚操作
2019/07/04 Python
dpn网络的pytorch实现方式
2020/01/14 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
Python decimal模块使用方法详解
2020/06/08 Python
Python如何实现Paramiko的二次封装
2021/01/30 Python
CSS3 完美实现圆角效果
2009/07/13 HTML / CSS
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
面向游戏玩家和书呆子的极客订阅盒:Loot Crate
2020/11/25 全球购物
应届毕业生就业自荐信
2013/10/26 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
化工专业求职信
2014/07/01 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
先进个人事迹材料范文
2014/12/30 职场文书
【DOTA2】总决赛血虐~ XTREME GAMING vs MAGMA - OGA DOTA PIT 2022 CN
2022/04/02 DOTA