假設有這樣一個目錄結構:
/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,這個方案不錯。