PyInstaller 打包 python程序成exe
pychaim下PyInstaller 打包 python程序
主题是使用PyInstaller 打包python时遇到一些问题以及解决方案,其中将要打包的程序是用tensorflow做的LSTM算法,这里不会涉及这个算法详解。
本地环境:window 10 服务器环境 windows2008
原文地址:原文
主要运行时版本依赖
python 3.6
PyInstaller 3.4
tensorflow 1.4 (过程中更新为1.7,原因下详)
jieba 0.39
wordcloud 1.5
安装与使用PyInstaller
在pychaim下可以直接打开下方Teminal 窗口 执行指令
pip install PyInstaller
打包python程序
PyInstaller -F XXXX.py
-F 是把所有的相关程序都打包成单个exe运行文件。
执行过程中会在当前项目根目录下 新建2个文件夹 build ,dist 与一个文件 XXXX.spec
build文件夹是在打包过程中临时存放所有中间文件的地方
dist是打包完成后的exe保存位置
XXXX.spec 与 打包时XXXX.py 是同名文件,自动生成了一份描述性文件,用来告诉pyinstaller 如何打包这个py程序。
所以一旦自动生成了一个spec文件 后续可以根据需求自行修改 spec文件,然后执行
PyInstaller -F XXXX.spec
遇到的问题
一,AttributeError: module ‘enum’ has no attribute ‘IntFlag
这个问题有文献1可知,是由于tensorflow 1.4 版本依赖了 enum34 这个库导致的错误,所以我升级为1.7 卸载掉了enum34库
二,tuple index out of range
这个异常是由文献2可知,pyinstaller当前版本不支持 python3.6 所以需要从GitHub那边下载develop版本替换掉本地的版本。
三,No such file or directory: 'c:xxxx\jieba\dict.txt'
由于接入了jieba库,因为该库里面用到了一些默认的资源文件如 dict.txt idx.txt 等,
这个疑问参考issue 文献3 ,但是解决方案治标不治本,另外还有很多资源文件都无法加载 如:wordcloud 中就加载了默认的 stopword 停用词字典。
因为在pyinstaller 打包后的exe 运行时会在 C:\Users\Administrator\AppData\Local\Temp 新增了一个临时文件夹如“_MEIxxxxxx” 所有py代码都会在临时存放在这里,
所以很多第三方库中如果使用了 __file__ 如下示例:(wordcloud源码)
FILE = os.path.dirname(__file__) FONT_PATH = os.environ.get('FONT_PATH', os.path.join(FILE, 'DroidSansMono.ttf'))
STOPWORDS = set(map(str.strip, open(os.path.join(FILE, 'stopwords')).readlines()))
jieba库也有类似加载方式。
会导致运行时__file__ 指向了上面说的临时文件夹“_MEIxxxxxx”,所以就会报错,说找不到该文件,无法打开。
一劳永逸的办法是修改 spec 文件.
先把一些需要加载的资源按照第三方库默认的文件结构放在 static(这个名字随你定) 文件夹内 ,如下图
然后根据官方文档参考文献4,修改spec的datas 节点
datas接收一个元组数组 [(x1,y1),(x2,y2)]
x1:是指需要打包的资源文件位置,可以是文件夹名称(我这里是static),单一文件,或者 带有通配符 * 的多个文件。
y1:是指需要输出到临时文件夹内的相对地址。这里我用了点符号 (.),代表临时文件夹本身。
这样需要的资源文件就包括进去了,也能正常读取了。
有其他办法是修改源码的,其实是很不优雅的。
四,No module named 'tensorflow.contrib'
这个异常在测试环境是没有的,只有打包之后运行才出现,原因是tensorflow.contrib 这个库是懒加载的,所以打包程序没有包括进去,只有在运行时才发现少了。
这里还是可以通过修改spec文件来隐性导入,就是上图里面的
hiddenimports=['tensorflow.contrib'],
结尾:引用请注明出处与作者
参考文献:
- https://blog.csdn.net/loovelj/article/details/79557456
- https://blog.csdn.net/qq_35614920/article/details/77096238
- https://github.com/fxsjy/jieba/issues/35
- https://pythonhosted.org/PyInstaller/spec-files.html#spec-file-operation
PyInstaller 打包 python程序成exe的更多相关文章
- 【Python】 如何用pyinstaller打包python程序成exe
[pyinstaller] pyinstaller在他们的官方网站上下载:http://www.pyinstaller.org/ 下载完pyinstaller之后还要安装一个支持包pywin32. 这 ...
- “failed to excute script xxx” PyInstaller 打包python程序为exe文件过程错误
在使用PyInstaller打包python程序,打包命令为: pyinstaller -F -w -i manage.ico yourpyfile.py 顺便说一下几个参数的作用 -F:是直接生成单 ...
- pyinstaller打包python文件成exe(原理.安装.问题)
py文件打包成exe文件的方式一共有三种:py2exe.PyInstaller和cx_Freeze 本文分四个步骤来详讲如何用PyInstaller将py文件打包成exe文件 1. PyInstall ...
- pyinstaller打包.py程序为.exe操作指南
pyinstaller打包.py程序为.exe操作指南 20190526内容纲要: 1.pyinstaller安装 2.程序封装 3.可执行程序 0 前言 今天第一次试试将一个py程序封装成一个.ex ...
- 【Python开发】PyInstaller打包Python程序
PyInstaller是一个能将Python程序转换成单个可执行文件的程序, 操作系统支持Windows, Linux, Mac OS X, Solaris和AIX.并且很多包都支持开箱即用,不依赖环 ...
- pyinstaller打包py文件成exe文件时,出现ImportError: No module named 'pefile'错误解决办法!
首先pyinstaller的安装与使用详见如下链接: 安装完成之后,命令行中输入pyinstaller之后,结果如下: ImportError: No module named 'pefile' 缺少 ...
- pyinstaller打包django项目成exe以及遇到的一些问题
1. 环境 环境为:win7 + Python3.6 + Django (2.1.10) + PyInstaller (3.5) 注意: 这里的PyInstaller,笔者是直接使用pip安装,中间会 ...
- PyInstaller打包Python脚本为exe
1.PyInstaller-3.1.1 百度云链接 http://pan.baidu.com/s/1jHYWin8 密码 oapl 2.安装最新版本的 pywin32-217.win32-py2 ...
- 用pyinstaller打包python程序、打包pyqt程序
将.py脚本拷贝到一个文件夹中: 然后shift+右键,打开Powershell窗口: -F:设置打包为一个.exe文件.(缺点打开速度慢,不加-F则不打包为一个.exe,优点简洁方便) -w:设置不 ...
随机推荐
- Python3学习(1)——初步了解
Python是解析性语言,Python解释器将源程序解释并执行. 基本语法 print() --打印字符串 -直接打印 print("hello world") 结果: hel ...
- 收集几个html和element-ui的录入控件
我希望有一个控件去显示或输入账本的金额 先做一些资料收集,也希望大家给个建议 输入银行账号会设置每四位添加一个空格 https://blog.csdn.net/wkx18330698534/artic ...
- python_flask 基础巩固(自定义URL转换器)
自定义URL转换器(在BaseConverter类外定义)from werkzeug.routing import BaseConverter定义类继承BaseConverter 实现类app.url ...
- Java中的一个类型转换问题
一.Object转Integer Java中hibernate或者ResultSetHandler查询sql语句, 返回的object类型其实是Long类型, 而不是Integer类型, 因此此时直接 ...
- 11个炫酷的Linux终端命令大全
我已经用了十年的Linux了,通过今天这篇文章我将向大家展示一系列的命令.工具和技巧,我希望一开始就有人告诉我这些,而不是曾在我成长道路上绊住我. 1.命令行日常系快捷键 如下的快捷方式非常有用,能够 ...
- ESP32随笔汇总
版权声明:本文为博主原创文章,未经博主本人不得转载.联系邮箱:mynoticeable@gmail.com 1.ubuntu 14.04下搭建esp32开发环境 2.UBUNTU14.0.4安装ecl ...
- ECharts常用设置记录
一.配置文档 http://echarts.baidu.com/option.html#title 二.属性配置 1.图表与边框容器距离. grid: { top: '10%', left: '70' ...
- 软件测试-homework3
printPrime()代码: public static void printPrimes (int n) { int curPrime; // Value currently considered ...
- pycharm激活码
MTW881U3Z5-eyJsaWNlbnNlSWQiOiJNVFc4ODFVM1o1IiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...
- 「HNOI2016」数据结构大毒瘤
真是 \(6\) 道数据结构毒瘤... 开始口胡各种做法... 「HNOI2016」网络 整体二分+树状数组. 开始想了一个大常数 \(O(n\log^2 n)\) 做法,然后就被卡掉了... 发现直 ...