浅析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 相关文章推荐
Django中模版的子目录与include标签的使用方法
Jul 16 Python
Python中matplotlib中文乱码解决办法
May 12 Python
用python生成1000个txt文件的方法
Oct 25 Python
用Python解决x的n次方问题
Feb 08 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
Jun 17 Python
python pandas写入excel文件的方法示例
Jun 25 Python
windows安装TensorFlow和Keras遇到的问题及其解决方法
Jul 10 Python
python搜索包的路径的实现方法
Jul 19 Python
python web框架中实现原生分页
Sep 08 Python
Python线程threading模块用法详解
Feb 26 Python
Python 面向对象静态方法、类方法、属性方法知识点小结
Mar 09 Python
Pandas 稀疏数据结构的实现
Jul 25 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中通过smtp发邮件的类,测试通过
2007/01/22 PHP
php自动加载方式集合
2016/04/04 PHP
Yii2.0表关联查询实例分析
2016/07/18 PHP
PHP递归实现汉诺塔问题的方法示例
2017/11/25 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
图片按比例缩放函数
2006/06/26 Javascript
window.showModalDialog参数传递中含有特殊字符的处理方法
2013/06/06 Javascript
JS闭包、作用域链、垃圾回收、内存泄露相关知识小结
2016/05/16 Javascript
多种jQuery绑定事件的实现方式
2016/06/13 Javascript
微信JSAPI支付操作需要注意的细节
2017/01/10 Javascript
js异步编程小技巧详解
2017/08/14 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
浅谈Vue初学之props的驼峰命名
2018/07/19 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
关于layui导航栏不展示下拉列表的解决方法
2019/09/25 Javascript
python双向链表实现实例代码
2013/11/21 Python
Python基于twisted实现简单的web服务器
2014/09/29 Python
基于Python os模块常用命令介绍
2017/11/03 Python
5款非常棒的Python工具
2018/01/05 Python
Python中 CSV格式清洗与转换的实例代码
2019/08/29 Python
flask框架json数据的拿取和返回操作示例
2019/11/28 Python
CSS+jQuery+PHP+MySQL实现的在线答题功能
2015/04/25 HTML / CSS
html5 Canvas画图教程(3)—canvas出现1像素线条模糊不清的原因
2013/01/09 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
Agoda.com官方网站:便宜预订全球酒店,高达80%的折扣
2018/04/04 全球购物
DELPHI中如何调用API,可举例说明
2014/01/16 面试题
追悼会上的答谢词
2014/01/10 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
关于对大人不礼貌的检讨书
2014/09/29 职场文书
2015年大学生入党自荐书
2015/03/24 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
2015年科研工作总结范文
2015/05/13 职场文书
婚宴致辞
2015/07/28 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL