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