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清除指定目录内所有文件中script的方法
Jun 30 Python
深入源码解析Python中的对象与类型
Dec 11 Python
Python解析最简单的验证码
Jan 07 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
Python Unittest自动化单元测试框架详解
Apr 04 Python
在mac下查找python包存放路径site-packages的实现方法
Nov 06 Python
使用python将多个excel文件合并到同一个文件的方法
Jul 09 Python
详解Python对JSON中的特殊类型进行Encoder
Jul 15 Python
pyinstaller打包opencv和numpy程序运行错误解决
Aug 16 Python
自定义django admin model表单提交的例子
Aug 23 Python
python反编译教程之2048小游戏实例
Mar 03 Python
Python中的 enumerate和zip详情
May 30 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
中国第一家无线电行
2021/03/01 无线电
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
PHP里的中文变量说明
2011/07/23 PHP
推荐一款MAC OS X 下php集成开发环境mamp
2014/11/08 PHP
WordPress开发中用于获取近期文章的PHP函数使用解析
2016/01/05 PHP
PHP Pipeline 实现中间件的示例代码
2020/04/26 PHP
php上传图片并给图片打上透明水印的代码
2010/06/07 Javascript
jquery的Tooltip插件 qtip使用详细说明
2010/09/08 Javascript
jquery如何实现在加载完iframe的内容后再进行操作
2013/09/10 Javascript
JS动态改变浏览器标题的方法
2016/04/06 Javascript
Vue.js每天必学之计算属性computed与$watch
2016/09/05 Javascript
详解XMLHttpRequest(一)同步请求和异步请求
2016/09/14 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
JS实现图片居中悬浮效果
2017/12/25 Javascript
jQuery实现图片上传预览效果功能完整实例【测试可用】
2018/05/28 jQuery
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
微信小程序中插入激励视频广告并获取收益(实例代码)
2019/12/06 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
js实现随机点名器精简版
2020/06/29 Javascript
基于vue中的scoped坑点解说
2020/09/04 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
python连接池实现示例程序
2013/11/26 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
详解Django中CBV(Class Base Views)模型源码分析
2019/02/25 Python
python各类经纬度转换的实例代码
2019/08/08 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
亚马逊墨西哥站:Amazon.com.mx
2018/08/26 全球购物
俄罗斯电动工具和设备购物网站:Vseinstrumenti.ru
2020/11/12 全球购物
Java如何格式化日期
2012/08/07 面试题
银行贷款承诺书
2014/03/29 职场文书
就业协议书怎么填
2014/09/15 职场文书
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android