浅析Python打包时包含静态文件处理方法


Posted in Python onJanuary 15, 2021

使用场景

  1. 已搭建了PyPI私有库,上传公共库包含静态文件,如需要使用sql静态文件初始化数据库。
  2. 打包python包,给其他人使用,但项目中包含静态文件,如html。

解决步骤

  1. 解决静态文件读取问题
  2. 解决静态文件打包问题

环境

Python3.8

PyCharm 2020

demo项目为例

  • 创建项目
  • 展示静态文件读取问题
  • 解决方案
  • 展示静态文件打包问题
  • 解决方案

1. 创建项目

创建一个demo项目(text-setup),目录如下

test-setup

demo

\_\_init\_\_.pydemo.pydemo.txt

/demo/demo.txt

The text is from demo.txt.

/demo/demo.py

import os
def get_txt():
  """使用原始打开io方式打开"""
  with open('demo.txt', 'r', encoding='utf-8') as f:
    return f.read()

def get_demo_txt():
  """修改获取路径方式,使用io打开"""
  current_dir = os.path.dirname(__file__)
  file_path = os.path.join(current_dir, 'demo.txt')
  with open(file_path, 'r', encoding='utf-8') as f:
    return f.read()
if __name__ == "__main__":
  """类内测试,均无异常"""
  print("get_demo_txt() :", get_demo_txt())
  # get_demo_txt() : The text is from demo.txt.

  print("get_txt() :", get_txt())
  # get_txt() : The text is from demo.txt.

在当前路径下执行demo.py文件没有异常(使用PyCharm直接右键run)

2. 展示静态文件读取问题

在根目录(或其他任意除demo.py文件路径)执行上面的demo.py文件就会报错

$ python demo/demo.py
get_demo_txt() : The text is from demo.txt.
Traceback (most recent call last):
 File "demo/demo.py", line 21, in <module>
  print("get_txt() :", get_txt()) # get_txt() : The text is from demo.txt.
 File "demo/demo.py", line 6, in get_txt
  with open('demo.txt', 'r', encoding='utf-8') as f:
FileNotFoundError: [Errno 2] No such file or directory: 'demo.txt'

明显看出

  • 直接使用相对路径读取静态文件的方式报错
  • 使用os.path.dirname(\_\_file\_\_)获取当前python文件路径并拼接的方式不会报错

3. 解决方案

使用os.path.dirname(\_\_file\_\_)的方式去获取当前python文件路径,再去拼接静态文件的路径

demo中将get_txt()方法删除,继续进行以下打包demo

4. 展示静态文件打包问题

打包,创建打包配置文件

/setup.py

from setuptools import find_packages, setup

setup(
  name='demo',
  version='1.0.0',
  packages=find_packages(),
  zip_sage=False,
)

执行打包命令

$ python setup.py sdist

打开打包信息文件,内容如下

/demo.egg-info/SOURCES.txt

setup.py
demo/__init__.py
demo/demo.py
demo.egg-info/PKG-INFO
demo.egg-info/SOURCES.txt
demo.egg-info/dependency_links.txt
demo.egg-info/top_level.txt

可以看出,demo.txt并不在资源文件中,可以实际试一下,其他项目引用这个文件执行获取文件也将报错FileNotFoundError

5. 解决方案

修改打包配置文件

/setup.py

from setuptools import find_packages, setup

setup(
  name='demo',
  version='1.0.0',
  packages=find_packages(),
  zip_sage=False,
  include_package_data=True, # 打包包含静态文件标识
)

增加配置文件

/MANIFEST.in

include demo/demo.txt

最终文件目录

test-setup

demo

\_\_init\_\_.pydemo.pydemo.txtsetup.pyMANIFEST.in

再次执行打包命令

$ python setup.py sdist

打开打包信息文件,内容如下

/demo.egg-info/SOURCES.txt

MANIFEST.in
setup.py
demo/__init__.py
demo/demo.py
demo/demo.txt
demo.egg-info/PKG-INFO
demo.egg-info/SOURCES.txt
demo.egg-info/dependency_links.txt
demo.egg-info/top_level.txt

可以看到demo.txt已经在打包信息当中,引用这个包也不会报错了

参考资料:

Creating a Source Distribution

Flask docs - Make the Project Installable

到此这篇关于Python打包时包含静态文件处理方法的文章就介绍到这了,更多相关Python打包静态文件内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
用Python给文本创立向量空间模型的教程
Apr 23 Python
在Python程序中实现分布式进程的教程
Apr 28 Python
python动态参数用法实例分析
May 25 Python
python函数形参用法实例分析
Aug 04 Python
Python使用Matplotlib实现Logos设计代码
Dec 25 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
Python读取数据集并消除数据中的空行方法
Jul 12 Python
计算机二级python学习教程(2) python语言基本语法元素
May 16 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
Python Opencv轮廓常用操作代码实例解析
Sep 01 Python
python基础详解之if循环语句
Apr 24 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 Python
pycharm 关闭search everywhere的解决操作
Jan 15 #Python
Pandas的数据过滤实现
Jan 15 #Python
Python爬虫定时计划任务的几种常见方法(推荐)
Jan 15 #Python
python 如何把docker-compose.yaml导入到数据库相关条目里
Jan 15 #Python
pandas针对excel处理的实现
Jan 15 #Python
详解Python中的文件操作
Jan 14 #Python
python中的时区问题
Jan 14 #Python
You might like
php实例分享之mysql数据备份
2014/05/19 PHP
php通过session防url攻击方法
2014/12/10 PHP
PHP中substr函数字符串截取用法分析
2016/01/07 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
浅谈PHP的exec()函数无返回值排查方法(必看)
2017/03/31 PHP
PHP中使用jQuery+Ajax实现分页查询多功能操作(示例讲解)
2017/09/17 PHP
再次更新!MSClass (Class Of Marquee Scroll通用不间断滚动JS封装类 Ver 1.6)
2007/02/05 Javascript
初试jQuery EasyUI 使用介绍
2010/04/01 Javascript
Jquery的hide及toggle方法让超链接慢慢消失
2013/09/06 Javascript
JS、CSS加载中的小问题探讨
2013/11/26 Javascript
网页广告中JS代码的信息监听示例
2014/04/02 Javascript
jQuery中parents()方法用法实例
2015/01/07 Javascript
PHP守护进程实例
2015/03/06 Javascript
基于Node.js的强大爬虫 能直接发布抓取的文章哦
2016/01/10 Javascript
JavaScript学习笔记之数组求和方法
2016/03/23 Javascript
JavaScript中instanceof运算符的使用示例
2016/06/08 Javascript
Extjs表单输入框异步校验的插件实现方法
2017/03/20 Javascript
jQuery实现图片下载代码
2019/07/18 jQuery
python pickle 和 shelve模块的用法
2013/09/16 Python
Python中property属性实例解析
2018/02/10 Python
如何不用安装python就能在.NET里调用Python库
2019/07/12 Python
python实现tail实时查看服务器日志示例
2019/12/24 Python
python numpy--数组的组合和分割实例
2020/02/24 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
python在地图上画比例的实例详解
2020/11/13 Python
python dir函数快速掌握用法技巧
2020/12/09 Python
Senreve官网:美国旧金山的奢侈手袋品牌
2019/03/21 全球购物
英国顶级足球鞋的领先零售商:Lovell Soccer
2019/08/27 全球购物
公共汽车、火车和飞机票的通用在线预订和销售平台:INFOBUS
2019/11/30 全球购物
Java面试题:请说出如下代码的输出结果
2013/04/22 面试题
2014年教师批评与自我批评思想汇报
2014/09/20 职场文书
售房协议书范本2014
2014/10/23 职场文书
2016参观监狱警示教育活动心得体会
2016/01/15 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
python OpenCV学习笔记
2021/03/31 Python
python必学知识之文件操作(建议收藏)
2021/05/30 Python