浅析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服务器与android客户端socket通信实例
Nov 12 Python
把项目从Python2.x移植到Python3.x的经验总结
Apr 20 Python
python删除指定类型(或非指定)的文件实例详解
Jul 06 Python
Python使用asyncio包处理并发详解
Sep 09 Python
使用Python搭建虚拟环境的配置方法
Feb 28 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
numpy ndarray 按条件筛选数组,关联筛选的例子
Nov 26 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
django使用JWT保存用户登录信息
Apr 22 Python
python3中编码获取网页的实例方法
Nov 16 Python
Python使用Kubernetes API访问集群
May 30 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 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对象转换为数组函数(递归方法)
2012/02/04 PHP
php环境套包 dedeampz 伪静态设置示例
2014/03/26 PHP
php两种无限分类方法实例
2015/04/21 PHP
PHP严重致命错误处理:php Fatal error: Cannot redeclare class or function
2017/02/05 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
Laravel-添加后台模板AdminLte的实现方法
2019/10/08 PHP
javascript中的几个运算符
2007/06/29 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
Hallo.js基于jQuery UI所见即所得的Web编辑器
2016/01/26 Javascript
详解JavaScript的AngularJS框架中的作用域与数据绑定
2016/03/04 Javascript
第二章之Bootstrap 页面排版样式
2016/04/25 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
2016/11/23 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
ECMAscript 变量作用域总结概括
2017/08/18 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
解决vue单页面修改样式无法覆盖问题
2019/08/05 Javascript
微信小程序地图实现展示线路
2020/07/29 Javascript
Vue.js中Line第三方登录api的实现代码
2020/06/29 Javascript
python在Windows8下获取本机ip地址的方法
2015/03/14 Python
详解Python实现多进程异步事件驱动引擎
2017/08/25 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
python: 判断tuple、list、dict是否为空的方法
2018/10/22 Python
纯python进行矩阵的相乘运算的方法示例
2019/07/17 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
django连接oracle时setting 配置方法
2019/08/29 Python
使用IDLE的Python shell窗口实例详解
2019/11/19 Python
Python Celery多队列配置代码实例
2019/11/22 Python
武汉高蓝德国际.net机试
2016/06/24 面试题
几个MySql的面试题
2013/04/22 面试题
不假外出检讨书
2014/01/27 职场文书
汽车维修专业自荐书
2014/05/26 职场文书
查摆问题自我剖析材料
2014/08/18 职场文书
赵氏孤儿观后感
2015/06/09 职场文书
详解Redis复制原理
2021/06/04 Redis
关于Vue中的options选项
2022/03/22 Vue.js