zoukankan      html  css  js  c++  java
  • 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,这个方案不错。

  • 相关阅读:
    python编写弹球游戏的实现代码
    Linux kernal
    ccc
    Ubuntu14.04 支持 exFat 格式操作
    Ubuntu 14.04 tar 打包系统安装到新机器
    Ubuntu14.04 dd命令克隆系统镜像安装到另一台机器上
    gzip 的使用
    gzip: stdin: unexpected end of file tar: Unexpected EOF in archive
    c++ 实现等待5s
    Ubuntu14.04 系统复制迁移到新的机器上
  • 原文地址:https://www.cnblogs.com/animalize/p/5642495.html
Copyright © 2011-2022 走看看