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 相关文章推荐
有关wxpython pyqt内存占用问题分析
Jun 09 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
Python 抓取动态网页内容方案详解
Dec 25 Python
pyqt5的QComboBox 使用模板的具体方法
Sep 06 Python
解决安装python库时windows error5 报错的问题
Oct 21 Python
Django JWT Token RestfulAPI用户认证详解
Jan 23 Python
python Web flask 视图内容和模板实现代码
Aug 23 Python
Python使用Slider组件实现调整曲线参数功能示例
Sep 06 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
Tensorflow 实现将图像与标签数据转化为tfRecord文件
Feb 17 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
PyTorch 如何设置随机数种子使结果可复现
May 12 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通用检测函数集合
2006/11/25 PHP
PHP微信红包API接口
2015/12/05 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
thinkPHP5.0框架URL访问方法详解
2017/03/18 PHP
php文件上传及下载附带显示文件及目录功能
2017/04/27 PHP
php 读写json文件及修改json的方法
2018/03/07 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
PHP设计模式之简单工厂和工厂模式实例分析
2019/03/25 PHP
关于javascript document.createDocumentFragment()
2009/04/04 Javascript
javascript动态判断html元素并执行不同的操作
2014/06/16 Javascript
js获取当前日期前七天的方法
2015/02/28 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
javascript checkbox/radio onchange不能兼容ie8处理办法
2017/06/13 Javascript
一个有意思的鼠标点击文字特效jquery代码
2017/09/23 jQuery
详解vue在项目中使用百度地图
2019/03/26 Javascript
详解vue 自定义组件使用v-model 及探究其中原理
2019/10/11 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
js实现金山打字通小游戏
2020/07/24 Javascript
python中查找excel某一列的重复数据 剔除之后打印
2013/02/10 Python
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
python django生成迁移文件的实例
2019/08/31 Python
关于win10在tensorflow的安装及在pycharm中运行步骤详解
2020/03/16 Python
Python virtualenv虚拟环境实现过程解析
2020/04/18 Python
500行python代码实现飞机大战
2020/04/24 Python
学习python需要有编程基础吗
2020/06/02 Python
捷克鲜花配送:Florea.cz
2018/10/29 全球购物
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
《莫高窟》教学反思
2014/02/25 职场文书
协议书怎么写
2014/04/21 职场文书
期末学生评语大全
2014/04/24 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP