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生成器generator之next和send的运行流程(详解)
May 08 Python
python 系统调用的实例详解
Jul 11 Python
PyQt5打开文件对话框QFileDialog实例代码
Feb 07 Python
python dataframe 输出结果整行显示的方法
Jun 14 Python
Python3.5局部变量与全局变量作用域实例分析
Apr 30 Python
详解Django模版中加载静态文件配置方法
Jul 21 Python
Django admin.py 在修改/添加表单界面显示额外字段的方法
Aug 22 Python
Python插入Elasticsearch操作方法解析
Jan 19 Python
pytorch数据预处理错误的解决
Feb 20 Python
在python3.64中安装pyinstaller库的方法步骤
Jun 02 Python
Python word文本自动化操作实现方法解析
Nov 05 Python
用python爬虫批量下载pdf的实现
Dec 01 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
windows下PHP APACHE MYSQ完整配置
2007/01/02 PHP
ci检测是ajax还是页面post提交数据的方法
2014/11/10 PHP
给ECShop添加最新评论
2015/01/07 PHP
php异常处理方法实例汇总
2015/06/24 PHP
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
一个背景云变换js特效 鼠标移动背景云变化
2012/12/28 Javascript
jQuery中DOM操作实例分析
2015/01/23 Javascript
JavaScript修改作用域外变量的方法
2016/03/25 Javascript
jQuery Ajax 全局调用封装实例代码详解
2016/06/02 Javascript
react-native动态切换tab组件的方法
2018/07/07 Javascript
vue 巧用过渡效果(小结)
2018/09/22 Javascript
JS实现的冒泡排序,快速排序,插入排序算法示例
2019/03/02 Javascript
Element Steps步骤条的使用方法
2020/07/26 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
跟老齐学Python之有点简约的元组
2014/09/24 Python
用Python登录Gmail并发送Gmail邮件的教程
2015/04/17 Python
详解Django+Uwsgi+Nginx的生产环境部署
2018/06/25 Python
python多进程使用及线程池的使用方法代码详解
2018/10/24 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
Python3安装Pillow与PIL的方法
2019/04/03 Python
python计算无向图节点度的实例代码
2019/11/22 Python
python连接PostgreSQL过程解析
2020/02/09 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
Python图像识别+KNN求解数独的实现
2020/11/13 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
利用Node实现HTML5离线存储的方法
2020/10/16 HTML / CSS
新百伦折扣店:Joe’s New Balance Outlet
2016/08/20 全球购物
介绍一下你对SOA的认识
2016/04/24 面试题
大学生标准自荐书
2014/06/15 职场文书
学生安全责任书模板
2014/07/25 职场文书
环境卫生倡议书
2014/08/29 职场文书
村委会贫困证明范本
2014/09/17 职场文书
文明旅游倡议书
2015/04/28 职场文书
2015年安全保卫工作总结
2015/05/14 职场文书
干货:我将这样书写我的演讲稿!
2019/05/09 职场文书
MySQL优化常用的19种有效方法(推荐!)
2022/03/17 MySQL