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:设置不 ...
随机推荐
- WebApi零碎总结
1.如果Content-Type是application/json,而POST和PUT的参数是[FromBody] string value,那么如果curl -d的值是'{"Name&qu ...
- Exception in thread "main" java.lang.UnsupportedClassVersionError : unsupported major.minor version 52.0
新建好springboot项目后,打开application运行main方法报如下错. 1.问题:Exception in thread "main" java.lang.Unsu ...
- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors 的问题
Centons下 其大概意思是fastestmirror不能使用,fastestmirror是yum的一个加速插件,具体我也没有仔细了解过,可能是系统不支持或者缺少组建导致的.处理办法就是禁用这个插件 ...
- BP神经网络 详解模板
%原始数据输入 P=[ - 6.142 - 27.5 5.068 - 31.7 5.196 - 34.1 6.362 - 31.54 6.472 - 30.17 6.578 - 29.53 6.351 ...
- 快速入门Vue
前端技术发展很快,近日一个项目中想用Vue框架,对此对Vue基础进行了一些学习整理 何为Vue,官网 解释Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架 这里记录 ...
- post和get请求的参数乱码
对于做Java WEB项目同学来说,中文乱码问题是一个经常遇到而又非常头痛的问题,而最容易出现乱码的环节就是在浏览器向服务器发送请求的过程,至于出现乱码的原因不是本文的关注的重点,想了解的朋友可以参考 ...
- 【repost】 JS变量重复声明以及忽略var 声明的问题及其背后的原理
JS的容错率很高,一些其他语言常见的小错误JS都能大度得包容,比如给一个方法传入超出预计的参数.在声明变量之前使用该变量(变量的声明提升解决了这个问题)等等,这里我们就要解剖一下JS变量重复声明以及当 ...
- IDEA的Database管理台如何显示
1.找出database的显示view 2.点击设置数据库,下载驱动文件,直接点击下载就行了,用什么数据库就下什么 3.填写服务器地址和用户名密码,点击测试,成功就表示连上了 4.一些常用按钮 5.目 ...
- JSTL配置文件下载地址
Apache Tomcat安装JSTL 库步骤如下: 从Apache的标准标签库中下载的二进包(jakarta-taglibs-standard-current.zip). 官方下载地址:http:/ ...
- #218 Iterate with JavaScript For Loops
一个条件语句只能执行一次代码,而一个循环语句可以多次执行代码. JavaScript 中最常见的循环就是“for循环”. for循环中的三个表达式用分号隔开: for ([初始化]; [条件判断]; ...