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

Python 如何使用importlib打开包中的文件?,python,pickle,python-importlib,Python,Pickle,Python Importlib,我试图将我正在处理的一个简单的web抓取应用程序的后端放入一个包中,但是这个应用程序依赖于从一个pickle python对象加载,我无法使用importlib将其加载到文件中。以前,当我将所有代码放在一个文件中,并且依赖open()时,所有代码都可以正常工作,但现在我在导入包时出错。发生此错误后,我尝试用importlib加载该文件,但无法使其正常工作 我将按照类似问题的答案中的步骤进行回答: 我的软件包中的文件结构是: mypackage\ __init__.py

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

我将按照类似问题的答案中的步骤进行回答:

我的软件包中的文件结构是:

mypackage\
        __init__.py
        parse.py
        search.py
        categories\
                categories.pickle
                generate_categories_if_corrupted.py
init.py的内容:

from %mymodule% import search
发生错误的代码:

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("")
错误:

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.
回溯(最近一次呼叫最后一次):
文件“%mypackage%\parse.py”,第15行,在
使用resources.open_二进制(categories,“categories.pickle”)作为cat:
文件“C:\Users\%me%\AppData\Local\Programs\Python\Python38\lib\importlib\resources.py”,第92行,以开放二进制形式
_检查位置(包装)
文件“C:\Users\%me%\AppData\Local\Programs\Python\38\lib\importlib\resources.py”,第82行,在检查位置
raise FileNotFoundError(f'Package没有位置{Package!r}')
FileNotFoundError:包没有位置
在处理上述异常期间,发生了另一个异常:
##正如预期的那样,只是一个带有错误消息的FileNotFoundError。
我该如何解决这个问题?这是我第一次尝试用Python将代码打包

提前感谢您的回答。

根据(您可能想去投票表决这个答案),对于
importlib.resources
来说,要完成它的工作,包中必须有一个
\uuuu init\uuuuuuuuuy.py
文件


因此,在您的情况下,我相信应该有一个
mypackage/categories/\uuu init\uuuuuu.py
文件(一如既往,该文件可以保留为空,但必须存在)。

出于好奇,为什么init.py中的导入行中有%。我只是没有发现我的包的名称与问题相关,所以它只是一个占位符。有一个常规的windows文件夹路径代替它。你是说类似于c:\foobar导入搜索的
?不确定这是问题所在,但我会添加一个
mypackage/categories/\uuuu init\uuuuuuuuuy.py
文件(文件可以保持为空)编辑:我建议完全阅读,这似乎确实表明,
importlib.resources
需要
\uuu init\uuuu.py
文件来完成它的工作。