浅析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 相关文章推荐
Flask框架学习笔记(一)安装篇(windows安装与centos安装)
Jun 25 Python
Python中操作文件之write()方法的使用教程
May 25 Python
Python制作简单的网页爬虫
Nov 22 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 Python
Python数据集切分实例
Dec 08 Python
对pandas通过索引提取dataframe的行方法详解
Feb 01 Python
基于pandas中expand的作用详解
Dec 17 Python
Python 之 Json序列化嵌套类方式
Feb 27 Python
python 中不同包 类 方法 之间的调用详解
Mar 09 Python
python如何获取网络数据
Apr 11 Python
详解Django中 render() 函数的使用方法
Apr 22 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 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
extjs 为某个事件设置拦截器
2010/01/15 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
JS+CSS实现大气的黑色首页导航菜单效果代码
2015/09/10 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
2015/11/17 Javascript
javascript事件绑定学习要点
2016/03/09 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
微信小程序 开发之快递查询功能的实现
2017/01/09 Javascript
JavaScript实现向select下拉框中添加和删除元素的方法
2017/03/07 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
nodejs模块nodemailer基本使用-邮件发送示例(支持附件)
2017/03/28 NodeJs
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
vue综合组件间的通信详解
2017/11/06 Javascript
手把手教你用Node.js爬虫爬取网站数据的方法
2018/07/05 Javascript
小程序实现分类页
2019/07/12 Javascript
Layui之table中的radio在切换分页时无法记住选中状态的解决方法
2019/09/02 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
c++生成dll使用python调用dll的方法
2014/01/20 Python
python实现删除文件与目录的方法
2014/11/10 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
解决python3中自定义wsgi函数,make_server函数报错的问题
2017/11/21 Python
PYTHON绘制雷达图代码实例
2019/10/15 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
python实现图片,视频人脸识别(opencv版)
2020/11/18 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
css3实例教程 一款纯css3实现的发光屏幕旋转特效
2014/12/07 HTML / CSS
俄罗斯的精英皮具:Wittchen
2018/01/29 全球购物
意大利巧克力店:Chocolate Shop
2019/07/24 全球购物
临床医学专业毕业生的自我评价
2013/10/17 职场文书
小学生三分钟演讲稿
2014/08/18 职场文书
党员检讨书
2014/10/13 职场文书
师范生小学见习总结
2015/06/23 职场文书
会计主管竞聘书
2015/09/15 职场文书
物业管理交接协议书
2016/03/24 职场文书