假设有这样一个目录结构:
/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 globfrom keyword import iskeywordfrom os.path import dirname, join, split, splitextbasedir = 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打包时,globl()、os.walk()等函数在这里会失灵。
在使用zipapp时,我们需要模块的帮助。把__init__.py换成这个就可以了,同样是遍历当前目录、并import找到的.py文件。
✔ 方案二:
import osimport pkgutilpkgpath = os.path.dirname(__file__)pkgname = os.path.basename(pkgpath)for _, file, _ in pkgutil.iter_modules([pkgpath]): __import__(pkgname+'.'+file)
代码更简洁、又能适用zipapp,这个方案不错。