从动态模块列表中调用方法

时间:2011-06-22 20:10:00

标签: python module

我正在尝试在这里做两件事,动态导入目录中的所有模块(金额/名称未知),然后为每个模块发现调用一个名为checkMe()的函数。 checkMe()保证在每个模块中,因此无需检查。这就是我到目前为止所做的:

导入

import sys
import os
import glob

pathname = os.path.dirname(sys.argv[0]) + "/"
pathname = pathname + "/modules/"

__modules__ = [ os.path.basename(f)[:-3] for f in glob.glob(os.path.dirname(pathname)+"/*.py")]

for module in __modules__:
    __import__(module)

调用checkMe()

for module in __modules__:
    m = getattr(sys.modules[__name__], module)
    getattr(m, 'checkMe').__call__()

但是我收到了这个错误:

AttributeError: 'module' object has no attribute 'sendme'

(sendme是第一个模块)

非常感谢任何帮助......谢谢!

1 个答案:

答案 0 :(得分:0)

__import__有一些关于包(包含__init__.py)和模块的目录的棘手语义。您需要使用fromlist参数才能使其正常工作。实际上,使用runpy最简单地按路径运行模块(来自注释:run_path需要Python 2.7或更新版本):

import runpy
runpy.run_path('path/to/file.py')