-
-
Notifications
You must be signed in to change notification settings - Fork 527
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bug: load_plugins加载时无法使用相对导入 #32
Comments
此外,我注意到NB1中load_plugins是通过调用load_plugin实现的,NB2中直接调用了底层的_load。这一变化使我的bot中对load_plugin的挂钩(为了监视自动部署状态)失效了。请问是为什么做出了这个选择呢? |
Python 3 以后,当相对目录中没有 __init__.py 时 Python 不会将该目录识别为一个包,因此会返回 no known parent package ,请问这两个 py 文件是否包含了 __init__.py ? |
添加__init__.py后仍然报错。测试中发现并没有执行__init__.py的内容,那就是说没有加载插件的父包? |
通过 nonebot.load_plugin 加载指定的一个包,py文件或者存在 __init__.py 的文件夹(被 Python3 所承认的一个合法的包)。相应地, nonebot.load_plugins 也要满足这些条件,考虑你当前的情况可能是需要被导入的包已经嵌套在了多层目录内,那该情况对应的其所有父级目录都需要存在 __init__.py (可以根据情况在必要层级的 __init__.py 进行额外的 import |
当目录结构如下所示:
以上情况通过 nonebot.load_plugins('plugins') 只能导入 base.py ,因为 addons 目录没有 __init__.py 不是一个合法的包。 此例为了在 solver.py 内导入 test.py 需要确保 addons 目录存在 __init__.py 即构成一个合法的包,然后就可以在 solver.py 通过
才能成功导入 test.py,或者按题主的原意,在 solver.py 用过
来成功导入 test.py 。而像题主在最开始所说的
理论上如果这个包合法并被成功导入,那同目录下自然可以用 from . import xxx 导入另一个 py 文件。 猜测实际情况可能是从多个父级导入,或者这个问题的本身就是 nonebot.load_plugins() 所使用的路径错。 |
@rmuchan 既然是插件式的开发,所以我并不推荐在插件间进行import,这可能带来不必要的麻烦,插件间应该尽可能的解耦。
关于这个问题,你可以尝试如下: 目录结构
解决方案一 在 解决方案二 在 |
由于nb1中load_plugins需要同时提供路径以及import的前缀,nb2中希望仅通过提供路径进行import,使用了 |
有道理,我之前的使用方式跟NB的设计有些出入。把文件下移了一层解决了。 |
描述问题:
在插件中使用相对导入时,使用load_plugins加载插件会抛出ImportError错误。
如何复现?
from . import
)load_plugins
加载插件目录ImportError: attempted relative import with no known parent package
期望的结果
无错误地加载两个插件。
环境信息:
The text was updated successfully, but these errors were encountered: