如何使用importlib打开包中的文件?

Lui*_*nti 4 python pickle python-importlib

我正在尝试将我正在处理的简单网络抓取应用程序的后端放入一个包中,但该应用程序依赖于从腌制的 python 对象加载,我无法使用 importlib 将其加载到文件中. 以前,当我将所有代码都放在一个文件中并依赖于 open() 时,一切正常,但现在我在导入包时出现错误。出现此错误后,我尝试使用 importlib 加载文件,但无法使其工作。

我正在按照来自类似问题的此答案中的步骤进行操作:How to read a (static) file from inside a Python package? .

我的包中的文件结构是:

mypackage\
        __init__.py
        parse.py
        search.py
        categories\
                categories.pickle
                generate_categories_if_corrupted.py
Run Code Online (Sandbox Code Playgroud)

init .py的内容:

from %mymodule% import search
Run Code Online (Sandbox Code Playgroud)

发生错误的代码:

import importlib.resources as resources
from pickle import load
from . import categories

try:
    with resources.open_binary(categories, "categories.pickle") as cat:
        CATS = load(cat)
except FileNotFoundError:
    raise FileNotFoundError("")
Run Code Online (Sandbox Code Playgroud)

错误:

Traceback (most recent call last):
  File "%mypackage%\parse.py", line 15, in <module>
    with resources.open_binary(categories, "categories.pickle") as cat:
  File "C:\Users\%me%\AppData\Local\Programs\Python\Python38\lib\importlib\resources.py", line 92, in open_binary
    _check_location(package)
  File "C:\Users\%me%\AppData\Local\Programs\Python\Python38\lib\importlib\resources.py", line 82, in _check_location
    raise FileNotFoundError(f'Package has no location {package!r}')
FileNotFoundError: Package has no location <module '%mypackage%.categories' (namespace)>

During handling of the above exception, another exception occurred:

## just a  FileNotFoundError with an error message, as expected.
Run Code Online (Sandbox Code Playgroud)

我该如何解决?这是我第一次尝试将我的代码放入 Python 包中。

预先感谢您的回答。

sin*_*roc 5

根据有关相关问题的这个答案(您可能想要去投票这个答案),为了importlib.resources完成它的工作__init__.py,包中必须有一个文件。

所以在你的情况下,我相信应该有一个mypackage/categories/__init__.py文件(一如既往,该文件可以留空,但它必须存在)。