【问题标题】:pkg_resources DeprecationWarning for use of '..' in resource pathpkg_resources DeprecationWarning 在资源路径中使用“..”
【发布时间】:2020-05-19 16:06:38
【问题描述】:

在 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 中的代码运行测试时,会显示 Deprecationwarning,指出“DeprecationWarning:不允许在资源路径中使用 .. 或绝对路径,并且会在未来的版本中引发异常。 "

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

【问题讨论】:

    标签: python package deprecation-warning pkg-resources


    【解决方案1】:

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

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

    【讨论】:

    • 感谢 Harben 的建议,不幸的是,这对我来说不起作用,我确实玩过 os.curdir 变量,但它指的是当前目录,而不是上层目录?
    【解决方案2】:

    似乎这个问题不仅导致了 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 文件进行安装。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-27
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-15
      相关资源
      最近更新 更多