如何在一个包中打开一个文件,用portlib?

2022-04-07 00:00:00 python pickle python-importlib

问题描述

我正在尝试将我正在开发的一个简单的Web抓取应用程序的后端放到一个包中,但该应用程序依赖于从一个已腌制的Python对象加载,而我无法使用portlib将该对象加载到文件中。以前,当我将所有代码放在一个文件中,并依赖于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

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%AppDataLocalProgramsPythonPython38libimportlibesources.py", line 92, in open_binary
    _check_location(package)
  File "C:Users\%me%AppDataLocalProgramsPythonPython38libimportlibesources.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.

如何修复此问题?这是我第一次尝试用Python将我的代码打包。

提前感谢您的答复。


解决方案

根据this answer on a related question(您可能希望提升此答案),要使importlib.resources完成其工作,包中必须有__init__.py文件。

所以在您的情况下,我认为应该有一个mypackage/categories/__init__.py文件(像往常一样,该文件可以保留为空,但它必须存在)。

相关文章