在 python 的虚拟环境中安装 pip 后如何访问资源文件?

how to access resource files after pip install in virtual env in python?

假设我有这个项目结构:

src
  |my_package
     __init__.py
    |utils
      __init__.py
      util.py
    |resources
      __init__.py
      my_resource.yml

在util.py中,我有这段代码需要资源文件才能工作:

import yaml
import importlib.resources
from my_package import resources

class Util:

  def merge_settings(self, settings: dict)->dict:
    with importlib.resources.path(resources, 'my_resource.yml') as p:
        with open(p) as file:
            default_settings = yaml.safe_load(file)

在我的开发环境中一切正常。

然后我用我的 setup.py 文件用这段代码制作了一个轮子:

import setuptools
import glob

resource_folder = 'my_package/resources'

setuptools.setup(
  name="my_package", 
  version="0.3",

  packages=setuptools.find_packages(),
  data_files=[(resource_folder, glob.glob(resource_folder+r'/*.yml'))]

然后我创建一个轮子:

python .\setup.py bdist_wheel 

我最终安装它用于另一个项目,使用名称为 my_env:

的虚拟环境
(my_env) D:\dev pip install my_package-0.3-py3-none-any.whl

但由于这一行,我的代码不再是 运行:

importlib.resources.path(resources, 'my_resource.yml')

原因在浏览my_env文件夹时找到,my_resource.yml不再在my_package中。

my_env
  |my_package
    |resources
      my_resource.yml
  |Lib
    |site-packages
      |my_package
        |resources
          __init__.py

但是这个位置对于轻松修改这个文件可能非常有用...我如何在我的开发环境中同时处理正确的资源调用以及在 pip 安装后使用它?我希望在需要时始终可以访问 yml 文件进行编辑,即使在 pip 安装之后...

谢谢你的帮助

您的 data_files 指定错误并且不是您想要的设置(它用于非包数据)。 data_files 中的键是从前缀的根开始放置的(假设您将包安装到 ./venv 而不是以 ./venv/lib/python#.#/site-packages/my_package/resources/... 结尾的数据,它们将以 venv/my_package/resources -- 绝对不是你想要的!)。

您想要的实际设置是 package_data:

    package_data={
        'my_package.resources': '*.yml',
    },

映射从带点的包名称映射到 glob,并将其放置在站点包中

无需使用 MANIFEST.in 等,因为这些文件会自动包含在您的包中

有关这方面的更多信息,我 made a video on the subject