前言

有时候我们想要发布写好的代码,使用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)教程相关推荐

  1. 利用pyinstaller将python项目脚本打包成可执行文件

    利用pyinstaller打包python项目 由于本文讲述还算比较详细,如果对pyinstaller有一定的了解,只需快速上手,可以直接跳到第四章结合实例进行操作. 1简介及安装pyinstalle ...

  2. Python 文件打包成可执行文件

    import randomwhile True:#系统给出随机数字sys_num = random.randint(1,10)print(sys_num)while True:print(" ...

  3. Python数据分析之Pandas读写外部数据文件

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写入数据 ...

  4. Postman高级应用——流程控制、调试、公共函数、外部数据文件

    postman客户端下载地址:https://www.getpostman.com/apps 流程控制 流程控制简言之就是设置接口的执行顺序,流程控制只有在collection runner或Newm ...

  5. python txt文件读写 pandas_Python数据分析之Pandas读写外部数据文件!

    阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写入数据 3 excel文件 3.1 读取数据 3.2 写入数据 4 mysql数据库 5 mongodb数据库 1 引言 ...

  6. python 按列读取数据并写入txt_Python数据分析之Pandas读写外部数据文件!

    阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写入数据 3 excel文件 3.1 读取数据 3.2 写入数据 4 mysql数据库 5 mongodb数据库 1 引言 ...

  7. pandas 取excel 中的某一列_Python数据分析之Pandas读写外部数据文件

    点击"机器学习算法与Python实战","置顶"公众号 重磅干货,第一时间送达 阅读目录 1 引言 2 文本文件(txt.csv) 2.1 读取数据 2.2 写 ...

  8. python怎么读取sav格式_利用Python读取外部数据文件

    利用Python读取外部数据文件 [color=rgb(0, 0, 0) !important]刘顺祥 [color=rgb(0, 0, 0) !important]摘要: 不论是数据分析,数据可视化 ...

  9. python从文件中读取数据_Python3 中把txt数据文件读入到矩阵中的方法

    下面为大家分享一篇Python3 中把txt数据文件读入到矩阵中的方法,具有很好的参考价值,希望对大家有所帮助.一起过来看看吧 1.实例程序: ''' 数据文件:2.txt内容:(以空格分开每个数据) ...

  10. oracle 11g dul,学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中

    试验模拟导出Oracle 11G数据库中数据文件坏块中表中的数据 以前一直以为dul对应的版本只能恢复最高的数据库版本一致,今天测试发现dul 10可以恢复11g最新版的数据库. 模拟环境SQL> ...

最新文章

  1. 盘点最受欢迎的十个开源大数据技术
  2. 两大电网大手笔投建能源大数据中心,15省都有哪些落地案例?
  3. DL之CNN:卷积神经网络算法应用之卷积神经网络实践技巧(DA/DP/WI/BN/H/O/R)、优化技术经验之详细攻略
  4. 更极速:EdgeRoutine边缘程序
  5. Python实现单例模式常量类
  6. SQL实战篇:SQL基础及执行顺序
  7. 少儿编程100讲轻松学python(十二)-python如何将数据写入txt
  8. PostgreSQL 最佳实践 - 在线增量备份与任意时间点恢复
  9. 别不把自己当有钱人 ——让白领族成为百万富翁族的六大理财秘籍
  10. Spring Tool Suite4安装和配置
  11. UI——day15.H5和小程序的设计
  12. linux bluefish制作网页,Bluefish编辑器
  13. 460.LFU 缓存
  14. 递归的理解(数据结构)
  15. 在脉脉匿名频道上看了这些公司的评价后,这里有几个结论
  16. 计算机相关审稿周期短的ei,2018审核时间短容易中的EI期刊
  17. 021 Rust死灵书之异常安全性
  18. 我学MSA 之:稳定性分析(控制图法)
  19. linux hexdump显示格式c数组,linux hexdump-显示文件十六进制格式
  20. java方面的文献综述怎么写_java毕业论文参考文献范文[工作范文]

热门文章

  1. linux 安装vmware-tools详解
  2. Beyond Compare 4常用配置
  3. LeetCode【119. 杨辉三角 II】
  4. OpenCV——颜色均匀渐变
  5. Autodesk BIM 360将基础设施建模也推向云端
  6. DiscuzNT改造-远程图片自动采集-DNT2.5(自动采集、源码下载)
  7. Rating Prediction——评分预测小结
  8. 【论文解读】ICLR2021 知识建模与信息抽取
  9. 【论文】NAACL2019 抽取式摘要之 SUMO
  10. 【干货】12场比赛实战经验分享给你!