Python实现插件机制——自动import一个目录下的所有.py文件


假设有这样一个目录结构:

    /src
          main.py
          /plugins
                __init__.py
                a.py
                b.py
                c.py
                d.py

要在执行import plugins语句时,自动import放在plugins目录下的所有.py文件。

可以在plugins目录下创建这样的一个__init__.py,遍历当前目录、并import找到的.py文件。

方案一

from glob import glob
from keyword import iskeyword
from os.path import dirname, join, split, splitext

basedir = dirname(__file__)

for name in glob(join(basedir, '*.py')):
    module = splitext(split(name)[-1])[0]
    if not module.startswith('_') and \
       module.isidentifier() and \
       not iskeyword(module):

       __import__(__name__+'.'+module)

但是上述代码并不适用被zipapp打包的程序。在被zipapp打包时,globl()、os.walk()等函数在这里会失灵。

 

在使用zipapp时,我们需要pkgutil模块的帮助。把__init__.py换成这个就可以了,同样是遍历当前目录、并import找到的.py文件。

方案二

import os
import pkgutil

pkgpath = os.path.dirname(__file__)
pkgname = os.path.basename(pkgpath)

for _, file, _ in pkgutil.iter_modules([pkgpath]):
    __import__(pkgname+'.'+file)

代码更简洁、又能适用zipapp,这个方案不错。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM