浅析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通过自定义isnumber函数判断字符串是否为数字的方法
Apr 23 Python
Python实现将xml导入至excel
Nov 20 Python
Python实现简单字典树的方法
Apr 29 Python
Django学习教程之静态文件的调用详解
May 08 Python
python的pip安装以及使用教程
Sep 18 Python
pandas dataframe添加表格框线输出的方法
Feb 08 Python
对python 自定义协议的方法详解
Feb 13 Python
Python操作注册表详细步骤介绍
Feb 05 Python
解决Jupyter Notebook使用parser.parse_args出现错误问题
Apr 20 Python
Python 的 __str__ 和 __repr__ 方法对比
Sep 02 Python
如何基于pandas读取csv后合并两个股票
Sep 25 Python
python 列表推导和生成器表达式的使用
Feb 01 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
地球防卫队:陪着奥特曼打小怪兽的人类力量 那些经典队服
2020/03/08 日漫
PHP下几种删除目录的方法总结
2007/08/19 PHP
PHP简单判断字符串是否包含另一个字符串的方法
2016/03/25 PHP
js同时按下两个方向键
2007/12/01 Javascript
js静态方法与实例方法分析
2011/07/04 Javascript
JavaScript 基础篇之运算符、语句(二)
2012/04/07 Javascript
浅析JavaScript中的同名标识符优先级
2013/12/06 Javascript
基于NodeJS的前后端分离的思考与实践(四)安全问题解决方案
2014/09/26 NodeJs
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
Node.js学习之地址解析模块URL的使用详解
2017/09/28 Javascript
js传递数组参数到后台controller的方法
2018/03/29 Javascript
vue使用rem实现 移动端屏幕适配
2018/09/26 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
vue 微信分享回调iOS和安卓回调出现错误的解决
2020/09/07 Javascript
[07:49]2014DOTA2国际邀请赛 Newbee夺冠后采访xiao8坦言奖金会上交
2014/07/23 DOTA
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
教你学会使用Python正则表达式
2017/09/07 Python
python通过ffmgep从视频中抽帧的方法
2018/12/05 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Pytorch实现LSTM和GRU示例
2020/01/14 Python
keras 读取多标签图像数据方式
2020/06/12 Python
HTML5自定义属性的问题分析
2019/08/16 HTML / CSS
Regatta官网:英国最受欢迎的户外服装和鞋类品牌
2019/05/01 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
Maxpeedingrods美国:高性能汽车零件
2020/02/14 全球购物
最新英语专业学生求职信范文
2013/09/21 职场文书
励志演讲稿500字
2014/08/21 职场文书
房地产端午节活动方案
2014/08/24 职场文书
毕业设计致谢词
2015/05/14 职场文书
大学生安全教育主题班会
2015/08/12 职场文书
旷工检讨书大全
2015/08/15 职场文书
十大最强飞行系宝可梦,BUG燕上榜,第二是飞行系王者
2022/03/18 日漫
90后经典动画片排行:《数码宝贝》第二,《小鲤鱼历险记》在榜
2022/03/18 日漫
Spring Boot配合PageHelper优化大表查询数据分页
2022/04/20 Java/Android