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 04 Python
Python 递归函数详解及实例
Dec 27 Python
python bottle框架支持jquery ajax的RESTful风格的PUT和DELETE方法
May 24 Python
Python类的继承和多态代码详解
Dec 27 Python
对python 调用类属性的方法详解
Jul 02 Python
Python 静态方法和类方法实例分析
Nov 21 Python
Python3.6 中的pyinstaller安装和使用教程
Mar 16 Python
Python使用多进程运行含有任意个参数的函数
May 02 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
Python中BeautifulSoup通过查找Id获取元素信息
Dec 07 Python
MoviePy简介及Python视频剪辑自动化
Dec 18 Python
Python中的min及返回最小值索引的操作
May 10 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程序61条面向对象分析设计的经验小结
2008/11/12 PHP
php验证手机号码(支持归属地查询及编码为UTF8)
2013/02/01 PHP
php截取字符串函数substr,iconv_substr,mb_substr示例以及优劣分析
2014/06/10 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
jQuery 对象中的类数组操作
2009/04/27 Javascript
Jquery下attr和removeAttr的使用方法
2010/12/28 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
JQuery获取表格数据示例代码
2014/05/26 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
HTML5实现留言和回复页面样式
2015/07/22 Javascript
jQuery实现伪分页的方法分享
2016/02/17 Javascript
JS实现随页面滚动显示/隐藏窗口固定位置元素
2016/02/26 Javascript
微信小程序实现根据字母选择城市功能
2017/08/16 Javascript
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
create-react-app构建项目慢的解决方法
2018/03/14 Javascript
iView框架问题整理小结
2018/10/16 Javascript
JavaScript的级联函数用法简单示例【链式调用】
2019/03/26 Javascript
微信小程序:数据存储、传值、取值详解
2019/05/07 Javascript
微信小程序解析富文本过程详解
2019/07/13 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
微信小程序实现选项卡滑动切换
2020/10/22 Javascript
[42:23]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第二场 12.10
2020/12/13 DOTA
浅析python递归函数和河内塔问题
2017/04/18 Python
Python字符串、整数、和浮点型数相互转换实例
2018/08/04 Python
tensorflow2.0与tensorflow1.0的性能区别介绍
2020/02/07 Python
解决Python数据可视化中文部分显示方块问题
2020/05/16 Python
Python 远程开关机的方法
2020/11/18 Python
AmazeUI 图标的示例代码
2020/08/13 HTML / CSS
咖啡店自主创业商业计划书
2014/01/22 职场文书
班组安全员工作职责
2014/02/01 职场文书
新护士岗前培训制度
2014/02/02 职场文书
仓库规划计划书
2014/04/28 职场文书
人力资源本科毕业生求职信
2014/06/04 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
社交电商模式的兴起:这些新的商机千万别错过
2019/07/26 职场文书
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python