1

在 Python 包中,我有一个数据文件,它嵌套在需要它的文件的“上方”。例如

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 中的代码的测试时,会显示一个弃用警告,指出“弃用警告:不允许在资源路径中使用 .. 或绝对路径,并将在未来的版本中引发异常。”

但我不确定解决这个问题的正确方法是什么?

4

2 回答 2

0

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

import os
from pathlib import Path

data_stream = pkg_resources.resource_stream(
        __name__, os.path.join(Path(os.curdir())[0], "data", "data.csv")
    )
于 2020-05-19T16:15:30.513 回答
0

似乎这个问题不仅导致了 DeprecationWarning,而且在从打包的 .egg 文件(但不是 .whl)安装时导致了错误 - 之前在此处记录:未从 python .egg 文件安装包数据

我对这两种方法的解决方法是将 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 文件进行安装。

于 2020-05-26T13:50:34.053 回答