pkg_resources 关于在资源路径中使用“..”的弃用警告

pkg_resources DeprecationWarning for use of '..' in resource path

在 Python 包中,我有一个数据文件嵌套在 'above' 一个需要它的文件中。例如

package
  data
    data.csv
  utils
    util.py

在util.py中,我使用pkg_resources将文件作为流获取;这允许代码 运行 来自源代码并作为软件包安装。

    data_stream = pkg_resources.resource_stream(
        __name__, os.path.join("..", "data", "data.csv")
    )

这工作正常,并允许按预期检索数据文件。

但是,当我 运行 测试使用 util.py 中的代码时,会显示弃用警告,说明 "DeprecationWarning: Use of .. or absolute path in a resource path is not allowed and will raise exceptions in a future release."

但我不确定处理此问题的正确方法是什么?

也许使用 Path 模块会更好,它也是跨平台的。

import os
from pathlib import Path

data_stream = pkg_resources.resource_stream(
        __name__, os.path.join(Path(os.curdir())[0], "data", "data.csv")
    )

似乎这个问题不仅导致了 DeprecationWarning,而且在从打包的 .egg 文件(而不是 .whl)安装时导致错误 - 以前记录在此处:package data not installed from python .egg file

我解决这两个问题的方法是将 data_resources.py 模块放置在与数据文件相同的级别,它定义了磁盘资源的数据结构。这避免了必须使用其中带有“..”的路径。

例如

package
  data
    data_resources.py
    data.csv
  utils
    util.py

其中 data_resources.py 可能包含如下内容:

data_stream = pkg_resources.resource_stream(__name__, "data.csv")
data_df = pd.read_csv(data_stream)

和util.py可以简单地导入:

from package.data.data_resources import data_df

我假设这是对这种情况更正确的方法,因为它抑制了 DeprecationWarnings,并允许从 .egg 和 .whl 文件安装。