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:设置不 ...
随机推荐
- openmp入门总结
Ref: https://wdxtub.com/2016/03/20/openmp-guide/ 简介 这门课作为 ECE 中少有的跟计算机科学相关的课,自然是必上不可.不过无论是 OpenMP 还是 ...
- Catalog
Java SE EE| Hibernate | Struts2Spring/SpringMVC | MyBatis C# Python PHP C/C++ | STL 汇编语言 ...
- ubuntu安装spyder和jupyter notebook
ubuntu安装spyder和jupyter notebook 安装spyder 安装spyder sudo apt install spyder sudo apt install spyder3 安 ...
- bootstrap中的dropdown组件扩展hover事件
bootstrap的下拉组件,需要点击click时,方可展示下拉列表.因此对于喜欢简单少操作的大家来说,点击一下多少带来不便,因此,引入hover监听,鼠标经过自动展示下拉框.其实在bootstrap ...
- aji unorder_map
- 修改MariaDB 路径
1.把mariadb服务停掉: service mariadb stop 2.把/var/lib/mysql整个目录复制到/work, sudo mkdir /work/data sudo cp -a ...
- Excel VBA(宏):添加宏
写在前面: .编写宏,打开VBA,双击ThisWorkbook对当前工作薄进行编写宏:双击Sheet1,对整个sheet编写宏: 或者创建模块,在模块里,编写.调试代码. 打开VBA的方法见第一讲,结 ...
- Layui++>>ajax传递数组,防止深度序列化
- easyui时的时间格式yyyy-MM-dd与yyyy-MM-ddd HH:mm:ss
easyui日期的转换,日期汉化导入:<script type="text/javascript" src="../easyui/locale/easyui-lan ...
- 【转载】关于在centos下安装python3.7.0以上版本时报错ModuleNotFoundError: No module named '_ctypes'的解决办法
3.7版本需要一个新的包libffi-devel,安装此包之后再次进行编译安装即可. #yum install libffi-devel -y #make install 原文:https://blo ...