浅析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实现的udp协议Server和Client代码实例
Jun 04 Python
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
Python类的定义、继承及类对象使用方法简明教程
May 08 Python
python协程用法实例分析
Jun 04 Python
Python开发之快速搭建自动回复微信公众号功能
Apr 22 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
python 高效去重复 支持GB级别大文件的示例代码
Nov 08 Python
django的ORM模型的实现原理
Mar 04 Python
Python中面向对象你应该知道的一下知识
Jul 10 Python
Python3和PyCharm安装与环境配置【图文教程】
Feb 14 Python
Python使用configparser库读取配置文件
Feb 22 Python
Python Pandas 删除列操作
Mar 16 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学习笔记之 函数声明(二)
2011/06/09 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
thinkPHP中create方法与令牌验证实例浅析
2015/12/08 PHP
JS 容错处理代码, 屏蔽错误信息
2021/03/09 Javascript
用js实现的一个Flash滚动轮换显示图片代码生成器
2007/03/14 Javascript
javascript 面向对象思想 附源码
2009/07/07 Javascript
JavaScript严格模式详解
2015/11/18 Javascript
jQuery遍历DOM节点操作之filter()方法详解
2016/04/14 Javascript
nodejs实例解析(输出hello world)
2017/01/03 NodeJs
jquery.form.js异步提交表单详解
2017/04/25 jQuery
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
Vue.js实现实例搜索应用功能详细代码
2017/08/24 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
微信小程序图片轮播组件gallery slider使用方法详解
2018/01/31 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
vue实现文件上传功能
2018/08/13 Javascript
记一次webapck4 配置文件无效的解决历程
2018/09/19 Javascript
详解element-ui日期时间选择器的日期格式化问题
2019/04/08 Javascript
JS字符串与二进制的相互转化实例代码详解
2019/06/28 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
浅谈vue单页面中有多个echarts图表时的公用代码写法
2020/07/19 Javascript
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
github配置使用指南
2014/11/18 Python
Python文件处理
2016/02/29 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
Python SQLAlchemy库的使用方法
2020/10/13 Python
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
香港家用健身器材、运动器材及健康美容仪器专门店:FitBoxx
2019/12/05 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
装修致歉信
2014/01/15 职场文书
委托书范本
2014/04/02 职场文书
暑期教师培训方案
2014/06/07 职场文书
2015年化验员工作总结
2015/04/10 职场文书
前端JavaScript大管家 package.json
2021/11/02 Javascript
mysql中varchar类型的日期进行比较、排序等操作的实现
2021/11/17 MySQL
win10清理dns缓存
2022/04/19 数码科技