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使用点操作符访问字典(dict)数据的方法
Mar 16 Python
Python实现对excel文件列表值进行统计的方法
Jul 25 Python
python导入时小括号大作用
Jan 10 Python
python实现简单遗传算法
Mar 19 Python
python三方库之requests的快速上手
Mar 04 Python
python中for循环变量作用域及用法详解
Nov 05 Python
python DataFrame转dict字典过程详解
Dec 26 Python
pytorch 图像中的数据预处理和批标准化实例
Jan 15 Python
解决django中form表单设置action后无法回到原页面的问题
Mar 13 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 Python
谈谈python垃圾回收机制
Sep 27 Python
Python Process创建进程的2种方法详解
Jan 25 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下一个阿拉伯数字转中文数字的函数
2007/07/16 PHP
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
php对数组排序代码分享
2014/02/24 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
基于Laravel 5.2 regex验证的正确写法
2019/09/29 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
javascript模版引擎-tmpl的bug修复与性能优化分析
2011/10/23 Javascript
Js制作简单弹出层DIV在页面居中 中间显示遮罩的具体方法
2013/08/08 Javascript
JS回调函数的应用简单实例
2014/09/17 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
AngularJs入门教程之环境搭建+创建应用示例
2016/11/01 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
详解微信小程序 相对定位和绝对定位
2017/05/11 Javascript
JS实现的将html转为pdf功能【基于浏览器端插件jsPDF】
2018/02/06 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
微信小程序加载机制及运行机制图解
2019/11/27 Javascript
python 中的列表解析和生成表达式
2011/03/10 Python
从零学python系列之新版本导入httplib模块报ImportError解决方案
2014/05/23 Python
纯Python开发的nosql数据库CodernityDB介绍和使用实例
2014/10/23 Python
Python操作CouchDB数据库简单示例
2015/03/10 Python
独特的python循环语句
2016/11/20 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
使用python获取电脑的磁盘信息方法
2018/11/01 Python
python实现自动打卡的示例代码
2020/10/10 Python
Pandas之缺失数据的实现
2021/01/06 Python
Jupyter Notebook 远程访问配置详解
2021/01/11 Python
HTML5几个设计和修改的页面范例分享
2015/09/29 HTML / CSS
WEB控件可以激发服务端事件,请谈谈服务端事件是怎么发生并解释其原理?自动传回是什么?为什么要使用自动传回?
2012/02/21 面试题
高级护理实习生自荐信
2013/09/28 职场文书
导游词欢迎词
2015/02/02 职场文书
2015年公共机构节能宣传周活动总结
2015/03/26 职场文书
《所见》教学反思
2016/02/23 职场文书
2019财务毕业实习报告
2019/06/27 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
5行Python代码实现一键批量扣图
2021/06/29 Python
Tomcat用户管理的优化配置详解
2022/03/31 Servers