- 需求示例
有一个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版权协议,转载请附上原文出处链接和本声明。