浅析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遍历指定文件及文件夹的方法
May 09 Python
python爬虫获取京东手机图片的图文教程
Dec 29 Python
一个Python最简单的接口自动化框架
Jan 02 Python
python队列queue模块详解
Apr 27 Python
浅谈python中requests模块导入的问题
May 18 Python
python中类的属性和方法介绍
Nov 27 Python
python调用c++传递数组的实例
Feb 13 Python
Python supervisor强大的进程管理工具的使用
Apr 24 Python
python对验证码降噪的实现示例代码
Nov 12 Python
python递归调用中的坑:打印有值, 返回却None
Mar 16 Python
记录一下scrapy中settings的一些配置小结
Sep 28 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
Nov 11 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
session 的生命周期是多长
2006/10/09 PHP
php算开始时间到过期时间的相隔的天数
2011/01/12 PHP
允许phpmyadmin空密码登录的配置方法
2011/05/29 PHP
PHP实现的封装验证码类详解
2013/06/18 PHP
php 根据url自动生成缩略图并处理高并发问题
2014/01/23 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
typecho插件编写教程(四):插件挂载
2015/05/28 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
PHP常用字符串操作函数实例总结(trim、nl2br、addcslashes、uudecode、md5等)
2016/01/09 PHP
PHP 获取指定地区的天气实例代码
2017/02/08 PHP
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
javascript中attachEvent用法实例分析
2015/05/14 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
在JSP中如何实现MD5加密的方法
2016/11/02 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
深入理解vue-loader如何使用
2017/06/06 Javascript
深入理解JavaScript和TypeScript中的class
2018/04/22 Javascript
JS异步错误捕获的一些事小结
2019/04/26 Javascript
详解小程序退出页面时清除定时器
2019/04/28 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
javascript实现滚动条效果
2020/03/24 Javascript
Python利用itchat对微信中好友数据实现简单分析的方法
2017/11/21 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
django API 中接口的互相调用实例
2020/04/01 Python
Python高并发解决方案实现过程详解
2020/07/31 Python
Python类class参数self原理解析
2020/11/19 Python
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
Linux管理员面试经常问道的相关命令
2013/04/29 面试题
中职生自我鉴定范文
2013/10/03 职场文书
优秀大学生推荐信范文
2013/11/28 职场文书
计算机操作自荐信
2013/12/07 职场文书
小学英语教学反思
2014/01/30 职场文书
小浪底导游词
2015/02/12 职场文书
Python 制作自动化翻译工具
2021/04/25 Python
如何通过cmd 连接阿里云服务器
2022/04/18 Servers