我正在使用以下程序 genimg.py 生成我的 latex 文档的图片:
#!/usr/bin/env python3
def figCircle():
print('generate circle picture')
def figSquare():
print('generate square picture')
def main():
for key, value in globals().items():
if callable(value) and key.startswith('fig'):
value()
if __name__== "__main__":
main()
现在,由于图像越来越多,我想将 genimg.py 拆分为更多文件,比如 genimgFirst.py 和 genimgSecond。 py 和 genimg.py 应该遍历以 genimg 开头的模块并执行以 fig 开头的所有函数。假设我在新修改的 genimg.py 的开头添加了 import genimgFirst 和 import genimgSecond。
这可能吗(无需革命,只需复制和粘贴我的 fig* 函数)?
编辑 这是合并@bluenote 和@inspectorG4dget 的两个答案后的代码:
#!/usr/bin/env python3
import glob
def main():
for fname in glob.glob("genimg*.py"): # get all the relevant files
if fname == "genimg.py":
continue
print('>>>> {}'.format(fname))
mod = fname.rsplit('.',1)[0]
mod = __import__(mod) # import the module
for k,v in mod.__dict__.items():
if callable(v) and k.startswith('fig'): v() # if a module attribute is a function, call it
if __name__== "__main__":
main()
请您参考如下方法:
您可以为导入的模块递归调用您的代码。有点像
import types
def call_functions(module_dict):
for key, value in module_dict.items():
if callable(value) and key.startswith('fig'):
value()
elif isinstance(value, types.ModuleType):
call_functions(value.__dict__)
if __name__=='__main__':
call_functions(globals())
