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. PHP日志组件Monolog的使用

    1.首先安装日志组件 composer require monolog/monolog 2.创建日志类 3.使用 4.结果  

  2. 高校github课程资源汇总

    序号 学校名称 学校类型 课程资源链接 1 清华大学 Top 计算机系课程攻略 https://github.com/Salensoft/thu-cst-cracker https://github. ...

  3. data_analysis:初识numpy

    import numpy as npimport pandas as pd# """第一种,使用loadtxt"""# # 加载数据路径# ...

  4. WPF 实现雪花效果

    雪花控件类: class MM:Control { DispatcherTimer dispatcherTimer = new DispatcherTimer(); public MM() { dis ...

  5. 「SOL」序列计数sequence (模拟赛)

    看了题解过后觉得好像有点熟悉--但是总之是想不起来怎么做的了,自己的做法也和题解不一样. 是一道很好的题啦,把两种做法都写一下作个总结. 题面 给定一个长度为 \(n\) (\(n\le 10^5\) ...

  6. Linux系统目录及说明

    Linux系统目录结构以及简单说明: (1)/:根目录 (2)/boot:很多Linux系统把内核映像和其他一些和启动有关的文件都放在这里. (3)/tmp:一般只是启动时产生的临时文件才会放在这个地 ...

  7. 软件工程日报一——Andriod的安装与配置

    建民老师给我们布置了一个编写记事本app的任务,因此需要我们下载andriod studio,下面是我的下载过程 在下载andriod studio之前,需要我们配置Java环境 进入控制面板,输入 ...

  8. Delphi 新语法:For in语句

    据说Delphi 2005开始支持For in语句.并没有深入调查,依然从万一博客学习并整理. 一.遍历 TStrings var List: TStrings; s: string; begin L ...

  9. verilog 和system verilog 文件操作

    1. 文件操作 Verilog具有系统任务和功能,可以打开文件.将值输出到文件.从文件中读取值并加 载到其他变量和关闭文件. 1.1 Verilog文件操作 1.1.1 打开和关闭文件 module ...

  10. python中items()和iteritems()的区别

    items()函数,将一个字典以dict_items的形式返回,因为字典是无序的,所以返回的列表也是无序的: 1 a ={'a':1,'b':2,'c':3,'d':4} 2 print(a.item ...