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 ...
随机推荐
- linux挂载磁盘步骤
一.查看需要挂载设备,如下sda(默认路径/dev/sda) 二.新建分区,执行如下命令进入操作 fdisk /dev/sda 1.m 查看可操作的命令 2.键入 n ,根据需要新建分区 3.键入 d ...
- react框架-知识点(ref,, setState)
react的思想:无必要勿增实体 1. ref 使用 myRef = React.createRef() <input ref={this.myRef}></input> 2. ...
- 微服务笔记之Euraka(2)
Eureka Server启动过程 入口:SpringCloud充分利用了SpringBoot的自动装配的特点 Eureka-server的jar包,发现在MERA-INF下面有配置文件spring. ...
- Java-根据父级id将List结构转Tree结构
List的stream public ResultData queryMenuList() { // 获取所有数据List List<MenuVo> list = MenuDao.quer ...
- [iOS] 随手记录 IDFA 的一些相关内容
IDFA IDFA,广告标识符,类似于这一台设备的唯一性标识符,一般提供给第三方去做一些广告的关联. 但如果用户完全 重置系统,或者 "还原位置与隐私" 这个广告标示符会重新生成 ...
- sync.Once
保证在 Go 程序运行期间的某段代码只会执行一次 func main() { o := &sync.Once{} for i := 0; i < 10; i++ { o.Do(func( ...
- IE和FireFox 对FORM enctype属性的认识存在差异
IE和FireFox 对FORM enctype属性的认识存在差异,一般来说对于动态创建的form,如果因为要上传文件的原因很自然的会使用类似如下的代码: 1 //create form 2 th ...
- Java基础学习:11、断点调试
1.可以用来查看错误以及查看代码的运行过程. 2.如何使用:
- 自己写的java教程,免费分享
自己写的一套java教程,主要用于内部培训使用,有需要的可以直接免费下载: http://it.zhenzikj.com/download/java.zip 一共写了3套: java语言基础.网络开发 ...
- uniapp获取位置
uni.getLocation({ type: 'gcj02', geocode: true, success: (res) => { uni.showModal({ title:JSON.st ...