浅析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实现冒泡,插入,选择排序简单实例
Aug 18 Python
python开发之文件操作用法实例
Nov 13 Python
实现python版本的按任意键继续/退出
Sep 26 Python
Python多线程扫描端口代码示例
Feb 09 Python
python:pandas合并csv文件的方法(图书数据集成)
Apr 12 Python
Python 3.7新功能之dataclass装饰器详解
Apr 21 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
Python远程开发环境部署与调试过程图解
Dec 09 Python
降低python版本的操作方法
Sep 11 Python
Django自带的用户验证系统实现
Dec 18 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
晶体管单管来复再生式收音机
2021/03/02 无线电
怎样在UNIX系统下安装php3
2006/10/09 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
Centos7.7 64位利用本地完整安装包安装lnmp/lamp套件教程
2021/03/09 Servers
Javascript UrlDecode函数代码
2010/01/09 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
jquery自定义插件开发之window的实现过程
2016/05/06 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
浅谈AngularJS中使用$resource(已更新)
2017/09/14 Javascript
webpack中CommonsChunkPlugin详细教程(小结)
2017/11/09 Javascript
基于jQuery实现定位导航位置效果
2017/11/15 jQuery
js canvas实现二维码和图片合成的海报
2020/11/19 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
[00:33]2018DOTA2亚洲邀请赛TNC出场
2018/04/04 DOTA
python解析xml文件实例分享
2013/12/04 Python
python3解析库BeautifulSoup4的安装配置与基本用法
2018/06/26 Python
Python退火算法在高次方程的应用
2018/07/26 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
Python confluent kafka客户端配置kerberos认证流程详解
2020/10/12 Python
NET程序员上机面试题
2015/05/23 面试题
高中毕业生生活的自我评价
2013/12/08 职场文书
办理退休介绍信
2014/01/09 职场文书
农民致富事迹材料
2014/01/23 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
2015年师德师风自我评价范文
2015/03/05 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
2015年关爱留守儿童工作总结
2015/05/22 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
MySQL之PXC集群搭建的方法步骤
2021/05/25 MySQL
python opencv将多个图放在一个窗口的实例详解
2022/02/28 Python
Java由浅入深通关抽象类与接口(下篇)
2022/04/26 Java/Android
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android