Python打包时包含静态文件处理方法
Python打包时包含静态文件处理方法
使用场景
- 已搭建了PyPI私有库,上传公共库包含静态文件,如需要使用sql静态文件初始化数据库。
- 打包python包,给其他人使用,但项目中包含静态文件,如html。
解决步骤
- 解决静态文件读取问题
- 解决静态文件打包问题
环境
Python3.8
PyCharm 2020
demo项目为例
步骤
- 创建项目
- 展示静态文件读取问题
- 解决方案
- 展示静态文件打包问题
- 解决方案
1. 创建项目
创建一个demo项目(text-setup),目录如下
- test-setup
- demo
- __init__.py
- demo.py
- demo.txt
- demo
/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__.py
- demo.py
- demo.txt
- setup.py
- MANIFEST.in
- demo
再次执行打包命令
$ 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 setup.py 包含静态文件及模板文件
package_data 和MANIFEST.in都写,include_package_data=True https://stackoverflow.com/a/3597263/8025086
- Python打包成exe,文件太大问题解决办法
Python打包成exe,文件太大问题解决办法 原因 解决办法 具体步骤 情况一:初次打包 情况二:再次打包 原因 由于使用pyinstaller打包.py文件时,会把很多已安装的无关库同时打包进去, ...
- maven打包时包含本地jar
项目中需要使用maven的打包工具,生成zip压缩包,使用的插件是assembly-plugin.因为一些特殊的原因,需要使用一些本地的jar进行依赖,加载外部jar后编码过程中没有任何问题,但是打包 ...
- maven 结合mybaits整合框架,打包时mapper.xml文件,mapper目录打不进war包去问题
首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...
- html包含html文件的方法
我们在写asp页面的时候,常常使用include命令来包含公共文件.由于这个方法用起来非常方便,于是很多人在HTML页面里尝试使用include,但是发现根本就不起作用.这是因为,include是VB ...
- 41.Python中加载静态文件
在一个网页中,不仅仅只有一个html骨架,还需要css样式文件,js执行文件以及一些图片等.因此在DTL中加载静态文件时一个必须要解决的问题.在DTL中,使用static标签来加载静态文件.要使用st ...
- C/C++不同文件夹下包含头文件的方法及#include的使用
转自:http://blog.sina.com.cn/s/blog_6e0693f70100so42.html 本文主要介绍了如何不同文件夹下使用预处理器指示符#include. 假设我们有如下一个工 ...
- python Tags 母板 组件 静态文件相关 自定义simpletag inclusion_tag
一.Tags(一)for 1.基本用法 <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% e ...
- 编写python程序和运行.py文件的方法步骤
前提:已安装好 Subliume Test 3 且已经添加好python编译系统,已安装好python3.7 一.新建一个文本文档,将后缀名改为.py 二.使用 Subliume Test 3 打开该 ...
- 基于springboot1.5.9整合shiro时出现静态文件找不到的问题
开门见山吧,上午对shiro进行整合了下,因为之前使用ssm框架对shiro框架整合过,所以觉得使用springboot再次对shiro框架进行整合也是没啥问题,但最后整合完之后,使用thymelea ...
随机推荐
- Java中如何处理大批量照片上传,然后调用图片上传服务区接口,使用异步吗,是不是需要用到多线程
bot回答: 可以使用多线程,在 Java 中,可以使用 ExecutorService 来实现线程池,让每一个处理上传批量照片的任务都子事与一个线程,然后分别调用图片上传服务区接口,进行图片的异步上 ...
- Django Rest Framework中文文档:Serializer relations
这是对DRF官方文档:Serializer relations的翻译,根据个人的理解对内容做了些补充.修改和整理. 一,django模型间的关系 在我们对数据进行建模时,最重要的一点就是根据功能需求分 ...
- cocos2d-lua 控制台输入Lua指令方便调试
用脚本进行开发,如果不能实时去输入指令,就丧失了脚本的一大特色,所以对cocos2d-x程序稍微修改下,使其可以直接从控制台读入lua指令,方便调试. 1 首先在行首加入lua的引用,如下 1 #in ...
- python爬虫cookies jar与字典转换
#将CookieJar转为字典: cookies = requests.utils.dict_from_cookiejar(r.cookies) #将字典转为CookieJar: cookies = ...
- docker+react+nginx部署
一.准备工作 1.先确保项目可以正常运行. 2.如果拉代码到Linux下进行打包,注意node版本,我就是版本不同,yarn build一直不成功. 3.找一个nginx的配置文件nginx.conf ...
- SQL注入之延时注入(10)
以下提供两种方式进行延时注入 GET /sqli/Less-10/?id=1"+and+sleep(5)--+ HTTP/1.1 Host: 192.168.245.146:6101 Use ...
- vue教程
vue教程 环境搭建 nodejs下载 nodejs官网 已经"下一步式安装"过, 本地电脑历史版本 Mac更新到官网最新版本 # 1.先查看本机node.js版本: node - ...
- NLP-transformer-分词库用法
NLP-transformer-分词库用法 参考文档: https://blog.csdn.net/orangerfun/article/details/124089467 1 pip install ...
- [JavaScript]实例化对象
使用语法结构创建的对象 function Duck(name) { var obj = { name: name, say: function (content) { console.log(cont ...
- Idea报错:Command line is too long.
https://blog.csdn.net/qq_40682764/article/details/109215368 run–>edit configurations–>你的项目–> ...