Python3 pkgutil get_data 用法

Jac*_* P. 8 package python-3.x

我正在尝试使用pkgutil.get_data从包中获取资源。我已经阅读了这个 API 的文档,其中说

要使用pkgutil.get_data(package, resource)....package参数应该是包的名称,采用标准模块格式 ( foo.bar)。参数resource应采用相对文件名的形式,使用 / 作为路径分隔符。

我对术语标准模块格式(foo.bar的理解感到困惑。假设我们有下面的例子,我想获取资源collection_effects.csv,我该如何调用这个API?

sound/                                            Top-level package
  __init__.py                                     Initialize the sound package
  effects/                                        Subpackage for sound effects
          __init__.py
          echo.py
          reverse.py
          cool_effects/
                      collection_effects.csv
          ...
Run Code Online (Sandbox Code Playgroud)

从文档中,我想我可以通过以下方式调用资源:

import pkgutil
res = pkg.util.get_data("sound.effects", "/cool_effects/collection_effects.csv") 
Run Code Online (Sandbox Code Playgroud)

,但是,似乎下面使用也会返回一个字节码(从文档中,无法获取资源将返回None):

res = pkg.util.get_data("sound/effects", "/cool_effects/collection_effects.csv")

我对标准模块格式的含义感到困惑,以及调用此 API 的正确方法是什么?

小智 8

我认为这可以解决你的问题

import pkgutil
res = pkgutil.get_data('sound.effects', 'cool_effects/collection_effects.csv')
Run Code Online (Sandbox Code Playgroud)

标准模块格式意味着您使用的内容import,因此它需要__init__.py文件。例如,您可以将__init__.py文件添加到cool_effects文件夹,然后使用此代码,它应该可以工作

import pkgutil
res = pkgutil.get_data('sound.effects.cool_effects', 'collection_effects.csv')
Run Code Online (Sandbox Code Playgroud)

  • 感谢 [PEP 420](https://www.python.org/dev/peps/pep-0420),从 Python 3.3 开始,你不需要 `__init__.py` 来将目录视为包。因此,即使没有`__init__.py`,上面的两个例子也可以工作 (2认同)