Python打包时包含静态文件处理方法

使用场景

  1. 已搭建了PyPI私有库,上传公共库包含静态文件,如需要使用sql静态文件初始化数据库。
  2. 打包python包,给其他人使用,但项目中包含静态文件,如html。

解决步骤

  1. 解决静态文件读取问题
  2. 解决静态文件打包问题

环境

Python3.8

PyCharm 2020

demo项目为例

步骤

  1. 创建项目
  2. 展示静态文件读取问题
  3. 解决方案
  4. 展示静态文件打包问题
  5. 解决方案

1. 创建项目

创建一个demo项目(text-setup),目录如下


  • test-setup

    • demo

      • __init__.py
      • demo.py
      • demo.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__.py
      • demo.py
      • demo.txt
    • setup.py
    • MANIFEST.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打包时包含静态文件处理方法的更多相关文章

  1. python setup.py 包含静态文件及模板文件

    package_data 和MANIFEST.in都写,include_package_data=True https://stackoverflow.com/a/3597263/8025086

  2. Python打包成exe,文件太大问题解决办法

    Python打包成exe,文件太大问题解决办法 原因 解决办法 具体步骤 情况一:初次打包 情况二:再次打包 原因 由于使用pyinstaller打包.py文件时,会把很多已安装的无关库同时打包进去, ...

  3. maven打包时包含本地jar

    项目中需要使用maven的打包工具,生成zip压缩包,使用的插件是assembly-plugin.因为一些特殊的原因,需要使用一些本地的jar进行依赖,加载外部jar后编码过程中没有任何问题,但是打包 ...

  4. maven 结合mybaits整合框架,打包时mapper.xml文件,mapper目录打不进war包去问题

    首先,来看下MAVENx项目标准的目录结构: 一般情况下,我们用到的资源文件(各种xml,properites,xsd文件等)都放在src/main/resources下面,利用maven打包时,ma ...

  5. html包含html文件的方法

    我们在写asp页面的时候,常常使用include命令来包含公共文件.由于这个方法用起来非常方便,于是很多人在HTML页面里尝试使用include,但是发现根本就不起作用.这是因为,include是VB ...

  6. 41.Python中加载静态文件

    在一个网页中,不仅仅只有一个html骨架,还需要css样式文件,js执行文件以及一些图片等.因此在DTL中加载静态文件时一个必须要解决的问题.在DTL中,使用static标签来加载静态文件.要使用st ...

  7. C/C++不同文件夹下包含头文件的方法及#include的使用

    转自:http://blog.sina.com.cn/s/blog_6e0693f70100so42.html 本文主要介绍了如何不同文件夹下使用预处理器指示符#include. 假设我们有如下一个工 ...

  8. python Tags 母板 组件 静态文件相关 自定义simpletag inclusion_tag

    一.Tags(一)for 1.基本用法 <ul> {% for user in user_list %} <li>{{ user.name }}</li> {% e ...

  9. 编写python程序和运行.py文件的方法步骤

    前提:已安装好 Subliume Test 3 且已经添加好python编译系统,已安装好python3.7 一.新建一个文本文档,将后缀名改为.py 二.使用 Subliume Test 3 打开该 ...

  10. 基于springboot1.5.9整合shiro时出现静态文件找不到的问题

    开门见山吧,上午对shiro进行整合了下,因为之前使用ssm框架对shiro框架整合过,所以觉得使用springboot再次对shiro框架进行整合也是没啥问题,但最后整合完之后,使用thymelea ...

随机推荐

  1. fastdfs虚拟机单机版搭建

    说明:github搭建步骤:https://github.com/happyfish100/fastdfs/wiki#trackermkdir /home/dfs #创建数据存储目录 cd /usr/ ...

  2. QT程序自动寻找依赖的DLL

    1.找到项目的生成目录,比如项目源码路径:E:\Qt\Login: 2.进入它的项目生成目录,拷贝出可执行程序,例如放置在 E:\QtApp中. 3.然后从开始菜单打开 Qt 命令行, a.输入命令 ...

  3. C#笔记誊录

    1.继承 面向对象的三大特征: 封装性 继承性  多态性 一.继承:类与类的关系 为什么会用继承:减少代码重复 优化 空间内存 实现多态 class 基类 { //基类成员 } class 子类:基类 ...

  4. 创建一个httpserver、httpclient

    最近因为要和java进行通信.约定好使用http协议进行消息传递.在网上找了很久server编写发现有个博主写的很详细,因此把东西记录下来以便下次使用.这是原博主网址:https://blog.csd ...

  5. Android学习——控件ProgressBar

    1.常用属性

  6. springcloud(三) - 负载均衡Ribbon

    功能介绍 基本保证每个服务不同的ip接收到的请求数量是一样的,确保在微服务下没有没有那个服务器负载过多而另外一个闲置. IRule:根据规则获取制定的服务 规则列表 RoundRobinRule:轮询 ...

  7. 1,docker遇到的问题1

    pushd "%~dp0"dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txtfor /f %% ...

  8. C# const, readonly, static readonly

    转: Const 定义的是静态常在对象初始化的时候赋值.以后不能改变它的值.属于编译时常量.不能用new初始化. Readonly 是只读变量.属于运行时变量.可以在类constructor里改变它的 ...

  9. vue打包添加时间戳,实现更新项目自动清除缓存

    本来vue打包会自动用chunkhash来解决缓存问题,但是部分浏览器不会自动更新,因此可以通过后面t=${ }的不同来实现自动重新加载文件,保持最新的界面 (1).webpack打包:修改build ...

  10. 【C和指针】6.指针

    1.指针变量的内容 int a=112, b=-1; float c=3.14; int *d=&a; int *e=&c; (1) 变量d和e被声明为指针,并用其他变量的地址予以初始 ...