Python中如何在打包模块时正确引用打包的静态资源

在代码中如何获取到使用 MANIFEST.in 包含进去的静态资源的位置呢?


Python中如何在打包模块时正确引用打包的静态资源
7 回复

能不能去读一遍 pyinstaller 的文档以及 google


在Python打包时引用静态资源,关键在于正确配置setup.pypyproject.toml,并在代码中使用pkg_resourcesimportlib.resources来访问。

1. 项目结构示例:

my_package/
├── my_package/
│   ├── __init__.py
│   ├── data/
│   │   └── config.json
│   └── icons/
│       └── icon.png
├── setup.py
└── MANIFEST.in

2. 配置setup.py

from setuptools import setup, find_packages

setup(
    name="my_package",
    packages=find_packages(),
    include_package_data=True,  # 关键参数
    package_data={
        'my_package': ['data/*.json', 'icons/*.png'],
    },
)

3. 配置MANIFEST.in(如果需要额外文件):

include my_package/data/*.json
include my_package/icons/*.png

4. 代码中访问资源:

方法A:使用importlib.resources(Python 3.7+推荐)

import importlib.resources

# 读取文本文件
with importlib.resources.open_text('my_package.data', 'config.json') as f:
    config = f.read()

# 读取二进制文件(如图片)
with importlib.resources.open_binary('my_package.icons', 'icon.png') as f:
    icon_data = f.read()

方法B:使用pkg_resources(兼容旧版本)

import pkg_resources

# 获取资源路径
config_path = pkg_resources.resource_filename('my_package', 'data/config.json')

# 直接读取内容
config = pkg_resources.resource_string('my_package', 'data/config.json')
icon_data = pkg_resources.resource_stream('my_package', 'icons/icon.png')

关键点:

  • include_package_data=True 必须设置
  • package_data 要明确指定资源文件模式
  • 使用绝对导入路径(如my_package.data.config
  • 测试时用pip install -e .安装开发版本

一句话建议:importlib.resources配合正确的打包配置来管理静态资源。

可以参考下 pypa sampleproject

__file__可以拿到当前文件的位置。

你不说你是用的 py2exe 还是 pyinstaller 吗

还能怎么用,直接用不久可以了吗

谢谢各位,我在 StackOverflow 上找到答案了,应该是用 pkg_resources

我之前可能没表达清楚,我是打包成 python 模块,不是可执行文件。

回到顶部