浅析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删除nginx缓存文件示例(python文件操作)
Mar 26 Python
Python编程之微信推送模板消息功能示例
Aug 21 Python
Python迭代器和生成器定义与用法示例
Feb 10 Python
python实现pdf转换成word/txt纯文本文件
Jun 07 Python
wxpython绘制圆角窗体
Nov 18 Python
基于python的列表list和集合set操作
Nov 24 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
Pytorch 实现冻结指定卷积层的参数
Jan 06 Python
OpenCV哈里斯(Harris)角点检测的实现
Jan 15 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
Python图像处理库PIL的ImageFilter模块使用介绍
Feb 26 Python
python运算符之与用户交互
Apr 13 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 文件上传全攻略
2010/04/28 PHP
PHP多线程抓取网页实现代码
2010/07/22 PHP
PHP中批量生成静态html(命令行下运行PHP)
2014/04/19 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
php基于curl主动推送最新内容给百度收录的方法
2016/10/14 PHP
php传值和传引用的区别点总结
2019/11/19 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
javascript &amp;&amp;和||运算法的另类使用技巧
2009/11/28 Javascript
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
JS setCapture 区域外事件捕捉
2010/03/18 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
wap图片滚动特效无css3元素纯js脚本编写
2014/08/22 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
让div运动起来 js实现缓动效果
2017/07/06 Javascript
nodejs结合Socket.IO实现的即时通讯功能详解
2018/01/12 NodeJs
20个最常见的jQuery面试问题及答案
2018/05/23 jQuery
JS 验证码功能的三种实现方式
2018/11/26 Javascript
ES10的13个新特性示例(小结)
2019/09/23 Javascript
Vue 使用beforeEach实现登录状态检查功能
2019/10/31 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
在博客园博文中添加自定义右键菜单的方法详解
2020/02/05 Javascript
[02:58]献给西雅图的情书_高清
2014/05/29 DOTA
[00:32]10月24、25日 辉夜杯外卡赛附加赛开赛!
2015/10/23 DOTA
Python绘制的二项分布概率图示例
2018/08/22 Python
破解安装Pycharm的方法
2018/10/19 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
python如何基于redis实现ip代理池
2020/01/17 Python
python实现Oracle查询分组的方法示例
2020/04/30 Python
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
Myprotein荷兰官网:欧洲第一运动营养品牌
2020/07/11 全球购物
广告设计专业自荐信范文
2013/11/14 职场文书
2014年学校财务工作总结
2014/12/06 职场文书
节约用水广告语60条
2019/11/14 职场文书
《Estab Life》4月6日播出 正式PV、主视觉图公开
2022/03/20 日漫
Python日志模块logging用法
2022/06/05 Python