浅析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 相关文章推荐
itchat接口使用示例
Oct 23 Python
Python实现抢购IPhone手机
Feb 07 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
python numpy 常用随机数的产生方法的实现
Aug 21 Python
用python拟合等角螺线的实现示例
Dec 27 Python
基于Python数据结构之递归与回溯搜索
Feb 26 Python
Python实现多线程下载脚本的示例代码
Apr 03 Python
Python预测2020高考分数和录取情况
Jul 08 Python
python pillow库的基础使用教程
Jan 13 Python
matplotlib部件之矩形选区(RectangleSelector)的实现
Feb 01 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
python3 sqlite3限制条件查询的操作
Apr 07 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
虫族 Zerg 历史背景
2020/03/14 星际争霸
PHP实现的DES加密解密实例代码
2016/04/06 PHP
php实现的mongoDB单例模式操作类
2018/01/20 PHP
ExtJS Window 最小化的一种方法
2009/11/18 Javascript
jquery getScript动态加载JS方法改进详解
2012/11/15 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
jQuery大于号(&gt;)选择器的作用解释
2015/01/13 Javascript
jQuery实现垂直半透明手风琴特效代码分享
2015/08/21 Javascript
基于JavaScript的操作系统你听说过吗?
2016/01/28 Javascript
js实现的简单图片浮动效果完整实例
2016/05/10 Javascript
HTML5+jQuery插件Quicksand实现超酷的星际争霸2兵种分类展示效果(附demo源码下载)
2016/05/25 Javascript
jquery插件autocomplete用法示例
2016/07/01 Javascript
Bootstrap和Angularjs配合自制弹框的实例代码
2016/08/24 Javascript
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
Vue 路由 过渡动效 数据获取方法
2018/07/31 Javascript
jQuery实现的页面弹幕效果【测试可用】
2018/08/17 jQuery
解决vux 中popup 组件Mask 遮罩在最上层的问题
2020/11/03 Javascript
[43:03]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/19 DOTA
Python编写百度贴吧的简单爬虫
2015/04/02 Python
在MAC上搭建python数据分析开发环境
2016/01/26 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
利用python解决mysql视图导入导出依赖的问题
2017/12/17 Python
python使用Pycharm创建一个Django项目
2018/03/05 Python
Python3多目标赋值及共享引用注意事项
2019/05/27 Python
十分钟搞定pandas(入门教程)
2019/06/21 Python
python的常见矩阵运算(小结)
2019/08/07 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
PyTorch预训练Bert模型的示例
2020/11/17 Python
Boden澳大利亚官网:英国在线服装公司
2018/08/05 全球购物
印刷工程专业应届生求职信
2013/09/29 职场文书
创业计划书中包含的9个方面
2013/12/26 职场文书
捐款活动总结
2014/08/27 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
邀请书格式范文
2015/02/02 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
Python图片验证码降噪和8邻域降噪
2021/08/30 Python