Git Product home page Git Product logo

Comments (8)

yanyongyu avatar yanyongyu commented on May 23, 2024 2

@rmuchan 既然是插件式的开发,所以我并不推荐在插件间进行import,这可能带来不必要的麻烦,插件间应该尽可能的解耦。

from . import错误

关于这个问题,你可以尝试如下:

目录结构

BotRepo/
	bot/
		plugins/
			a.py
			b.py

解决方案一

a.py 定义 __package__ = "plugins" 然后 from .b import xxx

解决方案二

b.py 中使用 from a import xxx绝对路径import,前提是a插件在b之前被加载!

from nonebot2.

rmuchan avatar rmuchan commented on May 23, 2024

此外,我注意到NB1中load_plugins是通过调用load_plugin实现的,NB2中直接调用了底层的_load。这一变化使我的bot中对load_plugin的挂钩(为了监视自动部署状态)失效了。请问是为什么做出了这个选择呢?

from nonebot2.

Lancercmd avatar Lancercmd commented on May 23, 2024

Python 3 以后,当相对目录中没有 __init__.py 时 Python 不会将该目录识别为一个包,因此会返回 no known parent package ,请问这两个 py 文件是否包含了 __init__.py ?

from nonebot2.

rmuchan avatar rmuchan commented on May 23, 2024

Python 3 以后,当相对目录中没有 init.py 时 Python 不会将该目录识别为一个包,因此会返回 no known parent package ,请问这两个 py 文件是否包含了 init.py ?

添加__init__.py后仍然报错。测试中发现并没有执行__init__.py的内容,那就是说没有加载插件的父包?

from nonebot2.

Lancercmd avatar Lancercmd commented on May 23, 2024

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

from nonebot2.

Lancercmd avatar Lancercmd commented on May 23, 2024

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

当目录结构如下所示:

repo/    # 工作目录
    plugins/
        addons/
            management/
                __init__.py
                solver.py
            test.py
        base.py

以上情况通过 nonebot.load_plugins('plugins') 只能导入 base.py ,因为 addons 目录没有 __init__.py 不是一个合法的包。

此例为了在 solver.py 内导入 test.py 需要确保 addons 目录存在 __init__.py 即构成一个合法的包,然后就可以在 solver.py 通过

from plugins.addons import test    # 当然,需要 plugins/ 目录也存在 __init__.py

才能成功导入 test.py,或者按题主的原意,在 solver.py 用过

from .. import test

来成功导入 test.py 。而像题主在最开始所说的

2.在一个文件中通过相对路径导入另一个(from . import)

理论上如果这个包合法并被成功导入,那同目录下自然可以用 from . import xxx 导入另一个 py 文件。

猜测实际情况可能是从多个父级导入,或者这个问题的本身就是 nonebot.load_plugins() 所使用的路径错。

from nonebot2.

yanyongyu avatar yanyongyu commented on May 23, 2024

此外,我注意到NB1中load_plugins是通过调用load_plugin实现的,NB2中直接调用了底层的_load。这一变化使我的bot中对load_plugin的挂钩(为了监视自动部署状态)失效了。请问是为什么做出了这个选择呢?

由于nb1中load_plugins需要同时提供路径以及import的前缀,nb2中希望仅通过提供路径进行import,使用了pkgutil.iter_modules遍历路径下的所有插件,如果找到替代方案可以改进这一部分

from nonebot2.

rmuchan avatar rmuchan commented on May 23, 2024

既然是插件式的开发,所以我并不推荐在插件间进行import,这可能带来不必要的麻烦,插件间应该尽可能的解耦。

有道理,我之前的使用方式跟NB的设计有些出入。把文件下移了一层解决了。

from nonebot2.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.