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 文件和输入输出小结
Oct 09 Python
Python中pygame的mouse鼠标事件用法实例
Nov 11 Python
在Linux系统上部署Apache+Python+Django+MySQL环境
Dec 24 Python
Python简单遍历字典及删除元素的方法
Sep 18 Python
Python解决N阶台阶走法问题的方法分析
Dec 28 Python
Python网络编程使用select实现socket全双工异步通信功能示例
Apr 09 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
关于Python3 类方法、静态方法新解
Aug 30 Python
使用浏览器访问python写的服务器程序
Oct 10 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
Python利用myqr库创建自己的二维码
Nov 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
php-perl哈希算法实现(times33哈希算法)
2013/12/30 PHP
PHP中file_get_contents高?用法实例
2014/09/24 PHP
PHP中Restful api 错误提示返回值实现思路
2016/04/12 PHP
PHP基于PDO调用sqlserver存储过程通用方法【基于Yii框架】
2017/10/07 PHP
PHP微信H5支付开发实例
2018/07/25 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
ExtJs事件机制基本代码模型和流程解析
2010/10/24 Javascript
Jquery和JS用外部变量获取Ajax返回的参数值的方法实例(超简单)
2013/06/17 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
如何利用AngularJS打造一款简单Web应用
2015/12/05 Javascript
省市选择的简单实现(基于zepto.js)
2016/06/21 Javascript
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
JavaScript表单验证完美代码
2017/03/02 Javascript
关于webpack代码拆分的解析
2017/07/20 Javascript
JavaScript实现图片懒加载的方法分析
2018/07/05 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
JS中async/await实现异步调用的方法
2019/08/28 Javascript
JS防抖和节流实例解析
2019/09/24 Javascript
解决layui页面按钮点击无反应,也不报错的问题
2019/09/29 Javascript
JavaScript canvas动画实现时钟效果
2020/02/10 Javascript
[01:12](回顾)DOTA2国际邀请赛,全世界DOTAer的盛宴
2014/07/01 DOTA
[03:32]2014DOTA2西雅图邀请赛 CIS外卡赛赛前black专访
2014/07/09 DOTA
Python赋值语句后逗号的作用分析
2015/06/08 Python
python利用装饰器进行运算的实例分析
2015/08/04 Python
python实现Floyd算法
2018/01/03 Python
Python编程实现线性回归和批量梯度下降法代码实例
2018/01/04 Python
pandas使用get_dummies进行one-hot编码的方法
2018/07/10 Python
python内置数据类型之列表操作
2018/11/12 Python
python 贪心算法的实现
2020/09/18 Python
Django如何实现防止XSS攻击
2020/10/13 Python
Python实现FTP文件定时自动下载的步骤
2020/12/19 Python
澳大利亚墨尔本的在线时装店:LORETA
2018/09/14 全球购物
奥地利领先的在线药房:SHOP APOTHEKE
2019/10/07 全球购物
Huda Beauty官方商店:化妆和美容产品
2020/09/05 全球购物
初二英语教学反思
2016/02/15 职场文书
python urllib库的使用详解
2021/04/13 Python