我有一个模块文件夹(称为模块),目前包含3个文件夹,每个文件夹都包含一个带有__init__.py
文件的包。
我想做的是遍历modules文件夹,导入每个包并执行其main()
函数。
我试图这样做:
import os
for dirnames in os.walk('modules'):
for subdirname in dirnames:
__import__("modules", subdirname)
func = getattr(subdirname, "main", None)
if func:
func()
但它似乎没有导入模块,更不用说执行函数了。
我尝试添加手动调用,但它返回了一个错误:
Traceback (most recent call last):
File "test.py", line 12, in <module>
rfm_433mhz.main()
NameError: name 'rfm_433mhz' is not defined
编辑: 我按照建议添加了更改,但仍然遇到AttributeError:
Module: rfm_433mhz
Traceback (most recent call last):
File "test.py", line 9, in <module>
func = getattr(module, "main")
AttributeError: 'module' object has no attribute 'main'
为了测试,__init__.py
文件有:
def main():
print "hello"
答案 0 :(得分:1)
__import__
返回导入的模块;它不会将其添加到全局命名空间。 subdirname
仍然是字符串对象,而不是模块。以下方法可行:
for dirname in os.list('modules'):
if os.isdir(os.path.join('modules', dirname)):
module = getattr(__import__("modules." + dirname), dirname)
func = getattr(module, "main", None)
if func:
func()
我在这里使用os.list()
; os.walk()
会递归目录,每次迭代都会返回(dirname, directories, files)
元组:
for root, dirs, files in os.walk('modules'):
for dir in dirs:
module = getattr(__import__("modules." + dir), dirname)
func = getattr(module, "main", None)
if func:
func()
dirs[:] = [] # don't recurse into directories.
使用importlib.import_module()
来改善自己:
from importlib import import_module
for dirname in os.list('modules'):
if os.isdir(os.path.join('modules', dirname)):
module = import_module(dirname, 'modules')
func = getattr(module, "main", None)
if func:
func()