我试图自动导入模块并在Python中执行main()

时间:2013-12-29 01:59:02

标签: python

我有一个模块文件夹(称为模块),目前包含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"

1 个答案:

答案 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()