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实现国外赌场热门游戏Craps(双骰子)
Mar 31 Python
解析Python中的异常处理
Apr 28 Python
python自定义异常实例详解
Jul 11 Python
Python 装饰器使用详解
Jul 29 Python
Python 多线程Threading初学教程
Aug 22 Python
Python删除Java源文件中全部注释的实现方法
Aug 30 Python
Python实现获取本地及远程图片大小的方法示例
Jul 21 Python
win10下tensorflow和matplotlib安装教程
Sep 19 Python
Django 表单模型选择框如何使用分组
May 16 Python
Django中使用haystack+whoosh实现搜索功能
Oct 08 Python
pycharm设置默认的UTF-8编码模式的方法详解
Jun 01 Python
Python制作运行进度条的实现效果(代码运行不无聊)
Feb 24 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
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
javascript json 新手入门文档
2009/12/03 Javascript
javascript下arguments,caller,callee,call,apply示例及理解
2009/12/24 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
jquery设置text的值示例(设置文本框 DIV 表单值)
2014/01/06 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
BootStrap 超链接变按钮的实现方法
2016/09/25 Javascript
详谈ES6中的迭代器(Iterator)和生成器(Generator)
2017/07/31 Javascript
Vue2.0基于vue-cli+webpack父子组件通信(实例讲解)
2017/09/14 Javascript
使用Bootstrap和Vue实现用户信息的编辑删除功能
2017/10/25 Javascript
如何利用vue+vue-router+elementUI实现简易通讯录
2019/05/13 Javascript
详解vue中的父子传值双向绑定及数据更新问题
2019/06/13 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Python3中的2to3转换工具使用示例
2015/06/12 Python
Fiddler如何抓取手机APP数据包
2016/01/22 Python
python中的字典使用分享
2016/07/31 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Python SqlAlchemy动态添加数据表字段实例解析
2018/02/07 Python
对Python中创建进程的两种方式以及进程池详解
2019/01/14 Python
python sklearn常用分类算法模型的调用
2019/10/16 Python
python实现猜单词游戏
2020/05/22 Python
python和JavaScript哪个容易上手
2020/06/23 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
Myprotein法国官网:欧洲第一运动营养品牌
2019/03/26 全球购物
Linux操作面试题
2012/05/16 面试题
Linux面试题LINUX系统类
2014/11/19 面试题
自我评价格式
2014/01/06 职场文书
运动会广播稿60字
2014/01/15 职场文书
征婚广告词
2014/03/17 职场文书
小学二年级学生评语
2014/04/21 职场文书
供电工程专业求职信
2014/08/09 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
会计求职自荐信范文
2015/03/04 职场文书
2019年励志签名:致拼搏路上的自己
2019/10/11 职场文书
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android
零基础学java之循环语句的使用
2022/04/10 Java/Android