关于python:Python打包时包含静态文件处理方法

9次阅读

共计 2409 个字符,预计需要花费 7 分钟才能阅读完成。

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

正文完
 0