我有一个目录,里面有任意数量的模块,每个模块只包含一个函数do_stuff
。例如:
foos/
__init__.py
foo_1.py
foo_2.py
...
foo_n.py
例如,foo_1.py 可能只是:
def do_stuff(bar):
if bar.blah:
return True
return False
从代码的其他地方,我想收集并运行所有do_stuff
函数。我虽然这对imp
模块很容易:
import imp
...
...
FOOS_DIR = os.path.join(MY_HOME, 'foos/')
MOD_REGEX = r'^(?!__).*\.py$'
foos = [imp.load_source(fname.split('.py')[0], FOOS_DIR)
for fname in os.listdir(FOOS_DIR)
if re.match(MOD_REGEX, fname)]
results = [foo.do_stuff('argument!') for foo in foos]
但是,这会导致:
AttributeError: "'module' object has no attribute 'do_stuff'"
从这里的最佳答案来看,我认为这是要走的路。如果是,也许我的语法是关闭的?毕竟,load_source
真的很宽容:
(pdb) imp.load_source('not_there', FOOS_DIR)
<module 'not_there' from '/home/blah/blah/foos'>
否则,我还能错过什么?