【发布时间】:2020-07-16 02:28:45
【问题描述】:
我正在尝试将我正在开发的一个简单的网络抓取应用程序的后端放入一个包中,但该应用程序依赖于从一个腌制的 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
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.
我该如何解决这个问题?这是我第一次尝试将我的代码放入 Python 中的包中。
提前感谢您的回答。
【问题讨论】:
-
出于好奇,为什么init.py的导入行中有%
-
我只是没有发现我的包裹名称与问题相关,所以它只是一个占位符。有一个常规的 windows 文件夹路径代替它。
-
你的意思是
from c:\foobar import search? -
不确定是不是问题,但我会添加一个
mypackage/categories/__init__.py文件(文件可以保持为空)。 -- 编辑:我建议完全阅读this answer,这似乎确实表明importlib.resources需要__init__.py文件才能完成其工作。
标签: python pickle python-importlib