pyinstaller打包程序所遇问题记录_pyinstaller venv问题_柯大侠爱喝水的博客-程序员秘密

技术标签: pyinstaller  python  RecursionError  

pyinstaller支持的参数功能

在这里插入图片描述
命令样式:
pyinstaller -w -i “d:\my.ico” -F mypy.py

python pyinstaller RecursionError: maximum recursion depth exceeded

在调用pyinstaller -F my.py 时报错如下:

递归超过了python的栈高度限制

  File "F:\Program_File\anaconda3\lib\ast.py", line 263, in generic_visit
    self.visit(value)
  File "F:\Program_File\anaconda3\lib\ast.py", line 253, in visit
    return visitor(node)
RecursionError: maximum recursion depth exceeded

解决方案

stackoverflow网友解决方案

Mustafa did guide me to the right direction, you have to increase the recursion limit. But the code has to be put to the beginning of the spec file and not in your python code:

import sys
sys.setrecursionlimit(5000)

Create the spec file with pyi-makespec first, edit it and then build by passing the spec file to the pyinstaller command. See the pyinstaller manual for more information about using spec files.

Please make sure to use pyinstaller 3.2.0, with 3.2.1 you will get ImportError: cannot import name ‘is_module_satisfies’ (see the issue on GitHub)

在此总结下解决步骤:
1)pyinstaller -F xxx.py
这一步肯定会报上述错误导致失败,但是会产生一个xxx.spec文件
2)在xxx.spec文件中增加两行(添加在原文件第二行):

import sys
sys.setrecursionlimit(5000)

再执行 pyinstaller xxx.spec 打包成功。

python pyinstaller Cannot find existing PyQt5 plugin directories

问题现象

Exception:
            Cannot find existing PyQt5 plugin directories
            Paths checked: C:/qt64/qt_1544645195969/_h_env/Library/plugins

解决方案

网友方案
I solved it by copying the pyqt5qmlplugin.dll to the path mentioned above C:/qt64/qt_1544645195969/_h_env/Library/plugins. Finally I got the .exe
意思就是:

  1. 手动创建C:/qt64/qt_1544645195969/_h_env/Library/plugins这个目录,
  2. 然后从anaconda下找到pyqt5qmlplugin.dll 这个库拷贝进去

在这里插入图片描述

python pyinstaller ‘utf-8’ codec can’t decode byte 0xce in position 123: invalid continuation byte

问题现象

----------------------------------------
'utf-8' codec can't decode byte 0xce in position 123: invalid continuation byte
These are the bytes around the offending byte:

解决方案

思路:编码格式问题(可直接解决问题)

  1. 改变控制台的编码格式为utf-8 解决方法,先在控制台中输入 chcp 65001切换控制台编码格式,再执行打包命令

如果还不行:
尝试将中文解释都去掉

python pyinstaller打包程序启动失败

现象

This application failed to start because it could not find or load the Qt platform plugin “windows”.

解决方案

吧这个文件夹,拷贝到执行程序同目录即可:
如果是anaconda环境,
c:\Program_File\anaconda3\Library\plugins\platforms

如果是python 环境:
C:\Python33\Lib\site-packages\PyQt5\plugins\platforms

pyinstaller打包程序exe过大(exe 300多M)

这个问题纠结了我两天,最终解决了

问题根源

  • 大部分是因为我们使用anaconda,然后包了一些库,例如 xlwings,openxl等包完,不用说直接上300M以上
  • 原因是anaconda库的关联关系太复杂,打包程序pyinstaller默认把相关的全部打包进去了
  • anaconda环境下大包的程序exe

解决方法

  • 最好用的办法就是新建python venv,在新的环境下去打包
  • 新建方法参考我另一篇博文: 如何新建python venv
  • 新建后,调用pyinstaller 打包,所调用的库、包都是新建的venv中的,和anaconda无关了
(venv) D:\pyvenv_a\venv>pyinstaller -F pyexcel\RWExcel.py pyexcel\operfile.py
......
1135 INFO: Bootloader d:\pyvenv_a\venv\lib\site-packages\PyInstaller\bootloader\Windows-64bit\run.exe
21135 INFO: checking EXE
21139 INFO: Building because toc changed
21140 INFO: Building EXE from EXE-00.toc
21141 INFO: Appending archive to EXE D:\pyvenv_a\venv\dist\RWExcel.exe
21169 INFO: Building EXE from EXE-00.toc completed successfully.

新建venv打包结果:

已经很小了,40M左右,(本身里边包含python解析器信息,基本都会大于10M)
更改环境后打包

顺带解决上述三问题

  1. 上述描述的三个问题,也随之不见了,意外中都被解决了

结论

  1. 解决以上所有问题,最好的版本就是新建python venv,基本能隔离很多问题
  2. 我们同时也可以推断出来,编码错误、堆栈到达上线等问题都是anaconda依赖库导致的间接问题,anaconda在给我们带来方便的同时,也挖了不少坑
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wskzgz/article/details/88912027

智能推荐

危机之后迎来机遇,企业对抗疫情的11点建议_云和数据张老师的博客-程序员秘密

2020年初,由于疫情影响,个人、组织、企业都遭受了不小的阻碍与挑战。不过老话说得好,危机背后则是新的机遇,相信在此次疫情之后, 我们一定能重振旗鼓,迎来新发展。一个多月前,当我敲下2019年品牌营销行业关键词为【太难】的时候,哪能想到,跨入2020年,“新型冠状病毒”疫情这只黑天鹅让行业的【难】成了全中国甚至全世界的【难】。而“黑天鹅事件”之后,紧跟着的是“蝴蝶效应”。整个春节我们看...

高抗干扰4键触摸芯片/低功耗4键4感应通道触摸芯片VK3604A/B,抗电源电压波动,稳定性好---资料/参数_jy01 sop-16 1s替代_Tel_18824662436的博客-程序员秘密

型号:VK3604/VK3604A品牌:VINKA/永嘉微电封装:SOP16年份:新年份概述:VK3604/VK3604A具有4个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的 集成度,仅需极少的外部组件便可实现触摸按键的检测。 提供了4路输出功能,可通过IO脚选择输出电平,输出模式,输出脚结构,单键/多键和最 长输出时间。芯片内部采用特殊的集成电路,具有高电源电压抑制比,可减少按键检测错误的 发生,此特性保证在不利环境条件的应用中芯片仍具有很高的可靠性。 此触摸芯片具

左侧点击后右侧添加tab标签栏以及内容_???111的博客-程序员秘密

<!DOCTYPE html><html><head><meta charset="utf-8" /><title>左侧点击后右侧添加tab标签栏以及内容</title><script type="text/javascript" src="http://files.cnblogs.com/fil...

bootstrap中jquery插件——警告框、工具提示框、弹出框、模态框_一颗冉冉升起的新星的博客-程序员秘密

bootstrap的JavaScript插件中提供了几种形式的提示框。其中就有警告框、工具提示框、弹出框和模态框。下面就来一个一个的看看它们是怎样使用的吧!警告框 它就是这个样子的,点击右侧的小叉子可以将它隐藏。如果不想要淡淡消失的效果可以将 .fade.in 类去掉,和bootstrap其他组件改变颜色的方式一样(只需将类 .alert-info改为 .alert-danger / .alert

【Untiy学习笔记】Rigidbody组件及其常用函数_一白梦人的博客-程序员秘密

前言提示:声明:此篇文章是个人学习笔记,并非教程,所以内容可能不够严谨。可作参考,但不保证绝对正确。如果你发现我的文章有什么错误,非常欢迎指正,谢谢哦。官方文档:MonoBehaviour...

松本行弘为什么要开发Ruby_turingbooks的博客-程序员秘密

Ruby是起源于日本的编程语言。近年来,特别是因为在Web开发方面的效率很高,Ruby引起了全世界的关注,它的应用范围也扩展到了很多企业领域。  作为一门编程语言,Ruby正在被越来越多的人所了解,而作为一介工程师的我,松本行弘,刚开始的时候并没有想过“让全世界的人都来用它”或者“这下子可以大赚一笔了”,一个仅仅是从兴趣开始的项目却在不知不觉中发展成了如今的样子。  当然了,作为一种兴趣,

随便推点

哈希表 - 数组中两个数的和为给定值_数组两个数相加等于给定的值_一杯红酒7的博客-程序员秘密

1.题目LeetCode: 1. 两数之和【easy】给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [

JavaScript对象创建模式_LUOandHUANG的博客-程序员秘密

JavaScript对象创建模式Object构造函数模式用法:先创建空Object对象,再动态添加属性/方法 适用场景:起使时不确定对象内部数据 问题:语句太多 代码解析: var p = new Object() p = {} p.name = 'Tom' p.age = 12 p.setName = function (name) { this.na...

Flink DataStream Window 触发器 Trigger_datastream trigger使用_wangpei1949的博客-程序员秘密

Flink DataStream触发器Trigger决定了何时触发WindowFunction计算。本文总结Flink内置触发器并梳理Trigger API。八大内置触发器EventTimeTriggerEventTime Window的默认触发器。基于事件时间,当Watermark>=Window End Time时,触发窗口计算。ContinuousEventTimeTr...

PMBOK笔记-第五章 项目范围管理_cuichao1900的博客-程序员秘密

第五章 项目范围管理项目范围管理包括的程序,要求能确保该项目所覆盖的整体工作要求和单项工作要求,从而促使项目工作成功地完成。它首先涉及到界定和控制项目包括的内容。图表5-1提供了主要项目范围管理程序的总述:5.1启动阶段--督促...

Linux下安装JDK(删除openjdk)_WHY_01的博客-程序员秘密

1. 查询是否默认安装有JDK[[email protected] bin]# java -versionjava version "1.6.0_22"OpenJDK Runtime Environment (IcedTea6 1.10.4) (rhel-1.41.1.10.4.el6-x86_64)OpenJDK 64-Bit Server VM (build 20.0-b11, mixe

windows常用命令行指令_LL596214569的博客-程序员秘密

原文地址:http://www.cnblogs.com/kekec/p/3662125.htmlwindows常用命令打开"运行"对话框(Win+R),输入cmd,打开控制台命令窗口...也可以通过cmd /c 命令 和 cmd /k 命令的方式来直接运行命令注:/c表示执行完命令后关闭cmd窗口;/k表示执行完命令后保留cmd窗口# 控制台命令窗口中一些技巧复制内容:右键...

推荐文章

热门文章

相关标签