python引用目录下各文件中的内容

  • 需求示例
    有一个config目录,想通过from config import XXX便可引用到下面三个文件中设定的变量:
    在这里插入图片描述
  • 目标
    我们需要这样的结果:

In [2]: from config import A,DD,CC
In [3]: A
Out[3]: 1

  • 错误示范
    当前直接引用,结果如下:
    在这里插入图片描述

  • 完整示范

  • 方法一:
    1.创建一个目录:
    mkdir config_test
    2.进入目录,创建config和shell脚本:

    cd config_test/
    mkdir config
    touch update_config.sh
    

    在这里插入图片描述
    编写脚本:vim update_config.sh
    内容如下:

      		for i in config/*.py;do 
      		echo $i|grep -v '__init__'|sed 's#config/\(.*\).py#from .\1 import *#g';
      		done > config/__init__.py			
    

    3.创建config目录并进入:
    vim b.py
    A = 1
    vim c.py
    CC = 1
    vim d.py
    DD = 2
    vim init.py,里面不写东西,现状:
    在这里插入图片描述
    4.回退到config_test目录,执行:
    sh update_config.sh ;cat config/__init__.py
    结果显示:
    在这里插入图片描述
    5.引用
    在这里插入图片描述

这样就可以引用到目录文件中的内容了,不过这种方式,只要新增一个文件,就必须再次执行脚本。

所以我们需要更便捷的方式,新增文件,可以自动扫描到这个目录下的内容,详情如下

  • 方法二:
    目录结构跟之前一样,不做更改,对__init__.py的内容加以更改,shell脚本update_config.sh也不需要
    init.py内容如下:
# __init__.py for config

def main():
    import importlib
    import os
    cwd = os.path.dirname(os.path.abspath(__file__))

    files = os.listdir(cwd)

    for i in files:
        if not i.startswith('_') and i.endswith('.py'):
            m = '.' + i[:-3]

            # get a handle on the module
            mdl = importlib.import_module(m, __package__)

            # is there an __all__?  if so respect it
            if "__all__" in mdl.__dict__:
                names = mdl.__dict__["__all__"]
            else:
                # otherwise we import all names that don't begin with _
                names = [x for x in mdl.__dict__ if not x.startswith("_")]

            # now drag them in
            globals().update({k: getattr(mdl, k) for k in names})
            globals().pop(i[:-3])

main()
globals().pop('main')

这段代码可自动读取新增目录下的文件内容,新增之后,直接引用即可,结果示例:
在这里插入图片描述
结果重现完啦~~~


版权声明:本文为quanqxj原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。