【问题标题】:How to open a file in a package with importlib?如何使用importlib打开包中的文件?
【发布时间】: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


【解决方案1】:

根据this answer on a related question(你可能想去投票赞成这个答案),importlib.resources 要完成它的工作,包中必须有一个__init__.py 文件。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2010-10-05
    • 1970-01-01
    • 2013-01-11
    • 2013-09-22
    • 2019-12-28
    相关资源
    最近更新 更多