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的装饰器模式与面向切面编程详解
Jun 21 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
详解 Python中LEGB和闭包及装饰器
Aug 03 Python
python实现单向链表详解
Feb 08 Python
python 返回列表中某个值的索引方法
Nov 07 Python
python遍历小写英文字母的方法
Jan 02 Python
python excel转换csv代码实例
Aug 26 Python
通过实例解析Python调用json模块
Dec 11 Python
pandas和spark dataframe互相转换实例详解
Feb 18 Python
Pyinstaller 打包发布经验总结
Jun 02 Python
在Pytorch中使用Mask R-CNN进行实例分割操作
Jun 24 Python
Python Matplotlib绘图基础知识代码解析
Aug 31 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
玩转图像函数库―常见图形操作
2006/09/03 PHP
php Try Catch异常测试
2009/03/01 PHP
PHP 显示客户端IP与服务器IP的代码
2010/10/12 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
解析php curl_setopt 函数的相关应用及介绍
2013/06/17 PHP
phpexcel导入excel数据使用方法实例
2013/12/24 PHP
php面向对象之反射功能与用法分析
2017/03/29 PHP
js获取dom的高度和宽度(可见区域及部分等等)
2013/06/13 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
Bootstrap中表单控件状态(验证状态)
2016/08/04 Javascript
jquery 点击元素后,滚动条滚动至该元素位置的方法
2016/08/05 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
AngularJS 使用ng-repeat报错 [ngRepeat:dupes]
2017/01/19 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
解决vue打包之后静态资源图片失效的问题
2018/02/21 Javascript
vue中axios解决跨域问题和拦截器的使用方法
2018/03/07 Javascript
Vue 实例事件简单示例
2019/09/19 Javascript
JavaScript字符串处理常见操作方法小结
2019/11/15 Javascript
[59:35]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第一场 1月8日
2021/03/11 DOTA
Python的Django框架中的表单处理示例
2015/07/17 Python
Python中装饰器高级用法详解
2017/12/25 Python
用Python将mysql数据导出成json的方法
2018/08/21 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
Python+Selenium实现自动化的环境搭建的步骤(图文)
2020/09/01 Python
一套比较完整的软件测试人员面试题
2012/05/13 面试题
个人应聘自我评价分享
2013/11/18 职场文书
怎样填写就业意向
2014/04/02 职场文书
2014国庆65周年领导讲话稿(3篇)
2014/09/21 职场文书
2019中小学生安全过暑期倡议书
2019/06/24 职场文书
python 爬取华为应用市场评论
2021/05/29 Python
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js
Nginx隐藏式跳转(浏览器URL跳转后保持不变)
2022/04/07 Servers