浅析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返回昨天日期的方法
May 13 Python
Python使用pygame模块编写俄罗斯方块游戏的代码实例
Dec 08 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
Mar 20 Python
python中利用xml.dom模块解析xml的方法教程
May 24 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
通过python+selenium3实现浏览器刷简书文章阅读量
Dec 26 Python
python 创建一个空dataframe 然后添加行数据的实例
Jun 07 Python
Python如何使用turtle库绘制图形
Feb 26 Python
Python调用jar包方法实现过程解析
Aug 11 Python
Python Web项目Cherrypy使用方法镜像
Nov 05 Python
通过实例解析python and和or使用方法
Nov 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系统流量分析的程序
2006/10/09 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
ucenter通信原理分析
2015/01/09 PHP
浅谈PHP进程管理
2019/03/08 PHP
php中yii框架实例用法
2020/12/22 PHP
javascript appendChild,innerHTML,join性能比较代码
2009/08/29 Javascript
用javascript获取当页面上鼠标光标位置和触发事件的对象的代码
2009/12/09 Javascript
js与jquery中获取当前鼠标的x、y坐标位置的代码
2011/05/23 Javascript
jquery实现图片等比例缩放以及max-width在ie中不兼容解决
2013/03/21 Javascript
Javascript执行效率全面总结
2013/11/04 Javascript
JavaScript中具名函数的多种调用方式总结
2014/11/08 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
jQuery实现表格展开与折叠的方法
2015/05/04 Javascript
详解AngularJS实现表单验证
2015/12/10 Javascript
再谈Angular4 脏值检测(性能优化)
2018/04/23 Javascript
Vue+Jwt+SpringBoot+Ldap完成登录认证的示例代码
2018/05/21 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
详解bootstrap-fileinput文件上传控件的亲身实践
2019/03/21 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
Python中的元类编程入门指引
2015/04/15 Python
python fabric实现远程部署
2017/01/05 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python实现人人自动回复、抢沙发功能
2018/06/08 Python
numpy添加新的维度:newaxis的方法
2018/08/02 Python
浅谈python的dataframe与series的创建方法
2018/11/12 Python
Python操作json的方法实例分析
2018/12/06 Python
Django 静态文件配置过程详解
2019/07/23 Python
python实现飞机大战小游戏
2019/11/08 Python
Python实现转换图片背景颜色代码
2020/04/30 Python
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
医科大学生毕业的自我评价分享
2013/11/12 职场文书
小学班主任寄语大全
2014/04/04 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
2015暑假打工实践报告
2015/07/13 职场文书
小学运动会报道稿
2015/07/22 职场文书