Pyinstaller将外部数据文件打包到可执行文件中(onefolder or onefile)教程
前言
有时候我们想要发布写好的代码,使用Pyinstaller进行打包,但是我们程序有很多需要读取的外部数据,比如深度神经网络读取网络参数做预测。因为Pyinstaller打包有两种形式onefile或者onefolder。下面分别介绍。
环境:
ubuntu 16.04
pyinstaller : 3.3.1
python : 3.5.2
案例
test.py与text.txt放在同一个目录底下
file = 'text.txt'
with open(file, 'r') as f:while True:line = f.readline() # 逐行读取if not line:breakprint(line)
onefolder
生成spec文件:
pyi-makespec test.py
修改test.spec:
由
# -*- mode: python -*-block_cipher = None
a = Analysis(['test.py'],pathex=['/home/lixin/test'],binaries=[],datas=[], ### <------- 改hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,name='test',debug=False,strip=False,upx=True,runtime_tmpdir=None,console=True )
改为:
block_cipher = None
a = Analysis(['test.py'],pathex=['/home/lixin/test'],binaries=[],datas=[('test.txt','.')], ## <---- 修改此处添加外部文件hiddenimports=[],hookspath=[],runtime_hooks=[],excludes=[],win_no_prefer_redirects=False,win_private_assemblies=False,cipher=block_cipher)
pyz = PYZ(a.pure, a.zipped_data,cipher=block_cipher)
exe = EXE(pyz,a.scripts,a.binaries,a.zipfiles,a.datas,name='test',debug=False,strip=False,upx=True,runtime_tmpdir=None,console=True )
打包:
pyinstaller test.spec
此时生成两个文件夹,build以及dist,dist中的test文件夹即为发布的文件夹,可以看到,
test.txt被copy到了里面与可执行文件是同目录,完成! |
onefile
其他操作跟onefolder相同,在生成s p e c时加上参数 -F
即:
pyi-makespec -F test.py
打包完成后,此时 dist下只有一个可执行文件,运行这个可执行文件,出现错误,找不到 ‘test.txt’ !!
原因:
运行可执行文件时,会先将可执行文件进行压缩,压缩的位置在 /tmp 下,再执行,所以被打包进去的数据文件在被解压的路径下,而,程序是在运行的路径下搜索,即可执行文件的目录下,所以找不到数据文件 |
添加如下代码:
import os
import sys
def resource_path(relative_path):""" Get absolute path to resource, works for dev and for PyInstaller """base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))return os.path.join(base_path, relative_path)
获取到pyinstaller临时文件夹的位置,再此位置进行文件搜索,即test.py文件修改如下:
import os
import sys
def resource_path(relative_path):""" Get absolute path to resource, works for dev and for PyInstaller """base_path = getattr(sys, '_MEIPASS', os.path.dirname(os.path.abspath(__file__)))return os.path.join(base_path, relative_path)file = 'text.txt'
print(resource_path(file)) ## <----- 打印一下看看是否在临时文件夹下搜索
with open(resource_path(file), 'r') as f:while True:line = f.readline() # 逐行读取if not line:breakprint(line)
重复以上步骤,在dist中运行可执行文件,得到如下结果:
(/tmp/_MEIY5Vljn/ 为我的pyinstaller临时文件夹)
/tmp/_MEIY5Vljn/test.txt
完美~
参考:
1. https://stackoverflow.com/questions/7674790/bundling-data-files-with-pyinstaller-onefile
2. https://pythonhosted.org/PyInstaller/usage.html#options
Pyinstaller将外部数据文件打包到可执行文件中(onefolder or onefile)教程相关推荐
- 利用pyinstaller将python项目脚本打包成可执行文件
利用pyinstaller打包python项目 由于本文讲述还算比较详细,如果对pyinstaller有一定的了解,只需快速上手,可以直接跳到第四章结合实例进行操作. 1简介及安装pyinstalle ...
- Python 文件打包成可执行文件
import randomwhile True:#系统给出随机数字sys_num = random.randint(1,10)print(sys_num)while True:print(" ...
- Python数据分析之Pandas读写外部数据文件
点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写入数据 ...
- Postman高级应用——流程控制、调试、公共函数、外部数据文件
postman客户端下载地址:https://www.getpostman.com/apps 流程控制 流程控制简言之就是设置接口的执行顺序,流程控制只有在collection runner或Newm ...
- python txt文件读写 pandas_Python数据分析之Pandas读写外部数据文件!
阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写入数据 3 excel文件 3.1 读取数据 3.2 写入数据 4 mysql数据库 5 mongodb数据库 1 引言 ...
- python 按列读取数据并写入txt_Python数据分析之Pandas读写外部数据文件!
阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写入数据 3 excel文件 3.1 读取数据 3.2 写入数据 4 mysql数据库 5 mongodb数据库 1 引言 ...
- pandas 取excel 中的某一列_Python数据分析之Pandas读写外部数据文件
点击"机器学习算法与Python实战","置顶"公众号 重磅干货,第一时间送达 阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写 ...
- python怎么读取sav格式_利用Python读取外部数据文件
利用Python读取外部数据文件 [color=rgb(0, 0, 0) !important]刘顺祥 [color=rgb(0, 0, 0) !important]摘要: 不论是数据分析,数据可视化 ...
- python从文件中读取数据_Python3 中把txt数据文件读入到矩阵中的方法
下面为大家分享一篇Python3 中把txt数据文件读入到矩阵中的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 1.实例程序: ''' 数据文件:2.txt内容:(以空格分开每个数据) ...
- oracle 11g dul,学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中
试验模拟导出Oracle 11G数据库中数据文件坏块中表中的数据 以前一直以为dul对应的版本只能恢复最高的数据库版本一致,今天测试发现dul 10可以恢复11g最新版的数据库. 模拟环境SQL> ...
最新文章
- 盘点最受欢迎的十个开源大数据技术
- 两大电网大手笔投建能源大数据中心,15省都有哪些落地案例?
- DL之CNN:卷积神经网络算法应用之卷积神经网络实践技巧(DA/DP/WI/BN/H/O/R)、优化技术经验之详细攻略
- 更极速:EdgeRoutine边缘程序
- Python实现单例模式常量类
- SQL实战篇:SQL基础及执行顺序
- 少儿编程100讲轻松学python(十二)-python如何将数据写入txt
- PostgreSQL 最佳实践 - 在线增量备份与任意时间点恢复
- 别不把自己当有钱人 ——让白领族成为百万富翁族的六大理财秘籍
- Spring Tool Suite4安装和配置
- UI——day15.H5和小程序的设计
- linux bluefish制作网页,Bluefish编辑器
- 460.LFU 缓存
- 递归的理解(数据结构)
- 在脉脉匿名频道上看了这些公司的评价后,这里有几个结论
- 计算机相关审稿周期短的ei,2018审核时间短容易中的EI期刊
- 021 Rust死灵书之异常安全性
- 我学MSA 之:稳定性分析(控制图法)
- linux hexdump显示格式c数组,linux hexdump-显示文件十六进制格式
- java方面的文献综述怎么写_java毕业论文参考文献范文[工作范文]