浅析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 socket编程实例详解
May 27 Python
python字典基本操作实例分析
Jul 11 Python
基于Python如何使用AIML搭建聊天机器人
Jan 27 Python
Python将图片批量从png格式转换至WebP格式
Aug 22 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
django-rest-framework解析请求参数过程详解
Jul 18 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
Aug 08 Python
Python 读取用户指令和格式化打印实现解析
Sep 02 Python
使用python制作一个解压缩软件
Nov 13 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Python异常处理机制结构实例解析
Jul 23 Python
python可视化大屏库big_screen示例详解
Nov 23 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
域名和cookie问题(域名后缀)
2012/10/10 PHP
php从数据库查询结果生成树形列表的方法
2015/04/17 PHP
Yii控制器中filter过滤器用法分析
2016/07/15 PHP
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
页面图片浮动左右滑动效果的简单实现案例
2014/02/10 Javascript
node.js实现端口转发
2016/04/14 Javascript
select自定义小三角样式代码(实用总结)
2017/08/18 Javascript
Vue2.0用 watch 观察 prop 变化(不触发)
2017/09/08 Javascript
vue实现员工信息录入功能
2020/06/11 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
python比较两个列表是否相等的方法
2015/07/28 Python
Python学习_几种存取xls/xlsx文件的方法总结
2018/05/03 Python
Python参数解析模块sys、getopt、argparse使用与对比分析
2019/04/02 Python
PyCharm 创建指定版本的 Django(超详图解教程)
2019/06/18 Python
python实现Dijkstra算法的最短路径问题
2019/06/21 Python
Python搭建Spark分布式集群环境
2019/07/05 Python
Python:二维列表下标互换方式(矩阵转置)
2019/12/02 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
编写类String 的构造函数、析构函数和赋值函数
2012/09/09 面试题
文员个人的求职信范文
2013/09/26 职场文书
函授毕业自我鉴定
2013/12/19 职场文书
幼儿园教育教学反思
2014/01/31 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
元宵节寄语大全
2015/02/27 职场文书
2015年度培训工作总结范文
2015/04/02 职场文书
2015法院个人工作总结范文
2015/05/25 职场文书
雷锋的故事观后感
2015/06/10 职场文书
学习委员竞选稿
2015/11/20 职场文书
校园文化艺术节开幕词
2016/03/04 职场文书
css背景和边框标签实例详解
2021/05/21 HTML / CSS
swagger如何返回map字段注释
2021/07/03 Java/Android
详解Vue中$props、$attrs和$listeners的使用方法
2022/02/18 Vue.js
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android