浅析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使用PIL缩放网络图片并保存的方法
Apr 24 Python
Python图像灰度变换及图像数组操作
Jan 27 Python
python实现获取Ip归属地等信息
Aug 27 Python
Python判断两个list是否是父子集关系的实例
May 04 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
Django文件存储 默认存储系统解析
Aug 02 Python
获取Pytorch中间某一层权重或者特征的例子
Aug 17 Python
python标识符命名规范原理解析
Jan 10 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
Python grpc超时机制代码示例
Sep 14 Python
python归并排序算法过程实例讲解
Nov 04 Python
Python爬虫之Selenium实现关闭浏览器
Dec 04 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
不要轻信 PHP_SELF的安全问题
2009/09/05 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
PHP常见数组函数用法小结
2016/03/21 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
PHP+Ajax简单get验证操作示例
2019/03/02 PHP
如何在PHP环境中使用ProtoBuf数据格式
2020/06/19 PHP
对textarea框的代码调试,而且功能上使用非常方便,酷
2006/06/30 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
jquery 提交值不为空的元素示例代码
2013/05/10 Javascript
jQuery获取iframe的document对象的方法
2014/10/10 Javascript
JS实现的N多简单无缝滚动代码(包含图文效果)
2015/11/06 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
JavaScript实现网页动态生成表格
2020/11/25 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
用Python解析XML的几种常见方法的介绍
2015/04/09 Python
对pandas的dataframe绘图并保存的实现方法
2017/08/05 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
Python画图实现同一结点多个柱状图的示例
2019/07/07 Python
如何解决django-celery启动后迅速关闭
2019/10/16 Python
利用Python小工具实现3秒钟将视频转换为音频
2019/10/29 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
初级Java程序员面试题
2016/03/03 面试题
酒吧副总经理岗位职责
2013/12/10 职场文书
家长寄语大全
2014/04/02 职场文书
水污染治理工程专业求职信
2014/06/14 职场文书
2014年幼儿园园务工作总结
2014/12/05 职场文书
关于上班时间调整的通知
2015/04/23 职场文书
预备党员介绍人意见
2015/06/01 职场文书
早安问候语大全
2015/11/10 职场文书
Python 多线程之threading 模块的使用
2021/04/14 Python
利用Java连接Hadoop进行编程
2022/06/28 Java/Android