遇坑

之前经过折腾,pyinstaller打包文件可以在别的windows7上运行。但是,mfk, 客户说是xp系统。崩溃

使用pyinstaller各种折腾,打包出来的依然是不是有效的win32程序,各种报错。

后来尝试使用 py2exe 打包

使用

问题

  • 不是有效的win32程序

    换32位的python,其他模块都重装,包括pyqt5

  • py2exe UnicodeDecodeError: 'gbk' codec can't decode

    py2exe 的runtime.py 里 打开文件制定为utf-8

    with open(target.script, "U",encoding="UTF-8") as script_file:
  • 编译PyQt5 异常

    把一句 Exception, e 该为 Exception as e 就好了

  • could not find or load the Qt platform plugin "windows"

    把 C:\Python34\Lib\site-packages\PyQt5\plugins 下的 platforms 拷贝到 打包目录下的platforms搞定

  • 找不到 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学习笔记] py2exe 打包的更多相关文章

  1. [python学习笔记] pyinstaller打包pyqt5程序无法运行

    问题 pyinstaller打包的pyqt5程序在部分电脑上会失败.用户截图提示下边错误日志 无法定位程序输入点 ucrtbase.terminate 于动态链接库 api-ms-win-crt-ru ...

  2. Python学习笔记(十三)

    Python学习笔记(十三): 模块 包 if name == main 软件目录结构规范 作业-ATM+购物商城程序 1. 模块 1. 模块导入方法 import 语句 import module1 ...

  3. Python学习笔记,day5

    Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...

  4. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  5. Python学习笔记之map、zip和filter函数

    这篇文章主要介绍 Python 中几个常用的内置函数,用好这几个函数可以让自己的代码更加 Pythonnic 哦 1.map map() 将函数 func 作用于序列 seq 的每一个元素,并返回处理 ...

  6. Python学习笔记总结

    目录 Python学习笔记总结 前言 安装 数据类型 Hello,World 变量 字符串 首字母大写 全部小写 全部大写 Tab和换行符 格式化 去除空格 List列表 列表增删改查排序 遍历列表 ...

  7. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  8. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  9. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

随机推荐

  1. 【Spring 核心】AOP 面向切面编程

    一.什么是面向切面编程? 二.通过切点来选择连接点 三.使用注解创建切面 四.在XML中声明切面 五.注入AspectJ切面

  2. spring boot / cloud (二) 规范响应格式以及统一异常处理

    spring boot / cloud (二) 规范响应格式以及统一异常处理 前言 为什么规范响应格式? 我认为,采用预先约定好的数据格式,将返回数据(无论是正常的还是异常的)规范起来,有助于提高团队 ...

  3. 给MySQL_5.7 配置环境变量

    给MySQL_5.7   配置环境变量... 1.右键我的电脑--选择属性 2.选择高级系统设置 3.根据MySQL的安装路径.来配置MYSQL_HOME环境变量 找到MySQL5.7的安装根目录 4 ...

  4. Java并发包中CopyOnWrite容器相关类简介

    简介: 本文是主要介绍,并发容器CopyOnWriteArrayList和CopyOnWriteArraySet(不含重复元素的并发容器)的基本原理和使用示例. 欢迎探讨,如有错误敬请指正 如需转载, ...

  5. Azure Storage Rest API Demo

    本文主要介绍如何使用C#基于Rest API 操作中国版Microsoft Azure Storage,涉及方法Put Blob.Get Blob以及Delete Blob,其它方法参考上面三种方法适 ...

  6. 手机自带输入法emoji表情的输入,提交及显示——纯前端解决方案

    很早之前就遇到过需要前端支持用户输入并提交emoji表情的问题,一直没有尝试去解决,今天再一次狭路相逢,该来的躲不过,那就着手解决吧. 大多数emoji表情都是4字节的utf-16编码(辅助平面字符, ...

  7. [2014-08-28]Mac系统上的几个命令解释器(控制台)

    irb 语言:Ruby 帮助:help 清屏:CTRL+L 自动完成:Tab+Tab (若未开启,则在/etc/irbrc中require 'irb/completion') 退出:quit/exit ...

  8. EF增删改查+使用Expression进行动态排序分页

    注:以下部分来自<ASP.NET MVC 企业级实战>一书的摘抄和改写以及部分个人学习心得. EF简单增删改查 增加 public static int Add() { using (No ...

  9. C# 反向生成工具(DAL BLL Modle)

    VS2015  ADO.NET无果后果断~! 动软生成:http://pan.baidu.com/s/1gfIf0ZL

  10. 自制EIGRP配置实验大全

    EIGRP综合实验 本实验可能会有一两个出错的地方,希望大家进行实验测试后,可以指正!当然绝大部分都是正确滴! 实验A:基本配置 A.0)实验目的: 熟悉eigrp的基本配置 A.1)实验拓扑: A. ...