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中处理字符串之isalpha()方法的使用
May 18 Python
图文讲解选择排序算法的原理及在Python中的实现
May 04 Python
详谈python read readline readlines的区别
Sep 22 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
使用python进行波形及频谱绘制的方法
Jun 17 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
django删除表重建的实现方法
Aug 28 Python
Win10里python3创建虚拟环境的步骤
Jan 31 Python
Python 忽略文件名编码的方法
Aug 01 Python
只用40行Python代码就能写出pdf转word小工具
May 31 Python
python基于turtle绘制几何图形
Jun 15 Python
pytorch实现加载保存查看checkpoint文件
Jul 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/08/31 PHP
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
php简单统计中文个数的方法
2016/09/30 PHP
php pdo连接数据库操作示例
2019/11/18 PHP
JQuery 无废话系列教程(一) jquery入门 [推荐]
2009/06/23 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
EasyUI 中 MenuButton 的使用方法
2012/07/14 Javascript
JavaScript词法作用域与调用对象深入理解
2012/11/29 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
JavaScript弹出窗口方法汇总
2014/08/12 Javascript
node.js中的fs.close方法使用说明
2014/12/17 Javascript
JavaScript简单实现弹出拖拽窗口(二)
2016/06/17 Javascript
jquery对象与DOM对象转化
2017/02/08 Javascript
JS中cookie的使用及缺点讲解
2017/05/13 Javascript
VUE前端cookie简单操作
2017/10/17 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
jQuery pagination分页示例详解
2018/10/23 jQuery
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
使用Karma做vue组件单元测试的实现
2020/01/16 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
小程序选项卡以及swiper套用(跨页面)
2020/06/19 Javascript
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
2018/02/21 Python
python实现linux下抓包并存库功能
2018/07/18 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
美国购买舞会礼服网站:Couture Candy
2019/12/29 全球购物
给校长的建议书
2014/03/12 职场文书
工作表扬信范文
2015/01/17 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
党员公开承诺书2016
2016/03/24 职场文书
使用Navicat Premium工具将oracle数据库迁移到MySQL
2021/05/27 Oracle
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
Pygame Time时间控制的具体使用详解
2021/11/17 Python
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python