浅析Python打包时包含静态文件处理方法
作者:mrr 发布时间:2023-05-29 01:12:10
使用场景
已搭建了PyPI私有库,上传公共库包含静态文件,如需要使用sql静态文件初始化数据库。
打包python包,给其他人使用,但项目中包含静态文件,如html。
解决步骤
解决静态文件读取问题
解决静态文件打包问题
环境
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
来源:https://segmentfault.com/a/1190000038959526


猜你喜欢
- python 自动化批量生成前端的HTML可以大大减轻工作量下面演示两种生成 HTML 的方法方法一:使用 webbrowser#codin
- 1、如果同时从同一个客户端插入很多行,使用含多个 VALUE的INSERT语句同时插入几行。这比使用单行INSERT语句快(在某些情况下快几
- 运维平台导入数据这一功能实在是太重要了,我敢说在没有建自己的cmdb平台前,大多数公司管理服务器信息肯定是表格,用表格最麻烦的就是有点更新就
- 默认转换器from flask import Flaskapp = Flask(__name__)#/user/123@app.route(
- 使用webpack搭建单页面程序十分常见,但在实际开发中我们可能还会有开发多页面程序的需求,因此我研究了一下如何使用webpack搭建多页面
- 实际应用中,会遇到需要把表的某些行转换成列,或者把列转换成行的情况。比如一张表在数据库中是这样的:图1但是,需要的结果可能是这样:图2这个时
- 当项目里用npm安装了babel-cli之类的包时,webstorm在索引node_modules文件时,会卡死接近这个问题的办法是把nod
- 1 基本概念1.1 命名空间 (namespace)命名空间是变量名到对象的映射(name -> obj)。目前大多数的命名空间以类似
- vscode 中 python 提示警告错误,但是还是能跑起来代码:Import "playwright.sync_api&quo
- 昨天遇到了一个奇怪的问题,在Python中需要传递dict参数,利用json.dumps将dict转为json格式用post方法发起请求:p
- APScheduler 简介在实际开发中我们经常会碰上一些重复性或周期性的任务,比如像每天定时爬取某个网站的数据、一定周期定时运行代码训练模
- 批量修改: EXEC sp_MSforeachtable 'exec sp_changeob
- 一,什么是JSON文件JSON和XML都是互联网上数据交换的主要载体。在JSON出现之前,大家一直用XML来传递数据。因为XML是一种纯文本
- 1.在搭建网络开始时,会调用到 keras.models的Sequential()方法,返回一个model参数表示模型2.model参数里面
- 本文转自微信公众号:"算法与编程之美"1、问题描述使用HBuilder做一个简单的社区浏览界面。2、解决方案这是对HBu
- 如下所示:##过滤HTML中的标签#将HTML中标签等信息去掉#@param htmlstr HTML字符串.def filter_tags
- 发现问题最近在工作中遇到一个问题,通过查找相关的解决方法终于解决,下面话不多说了,来一起看看详细的介绍吧命令行会出现如下错误信息Syntax
- 本文实例讲述了python访问mysql数据库的实现方法。分享给大家供大家参考,具体如下:首先安装与Python版本匹配的MySQLdb示例
- 最近几年,jupyter在全球数据科学领域,已经成为不可或缺的重要工具。在jupyter中用python写程序,若import了自己写的外部
- 第一次写博客,实属心血来潮。为什么要写这篇博客呢?原因如下1、有一次我想配置数据库端口号时,找不到对应的解决方案2、是时候有个地方可以记录一