imp.load_source 的问题:'module' 没有属性 'foo'
Trouble with imp.load_source: 'module' has no attribute 'foo'
我有一个目录,其中包含任意数量的模块,每个模块只包含一个函数 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'"
根据最佳答案 here,我认为这是可行的方法。如果是,也许我的语法不对?毕竟load_source
真的很宽容:
(pdb) imp.load_source('not_there', FOOS_DIR)
<module 'not_there' from '/home/blah/blah/foos'>
不然我还能少什么?
确实是语法问题!我需要模块文件 的完整路径 ,而不仅仅是它的目录,作为 load_source
:
的第二个参数
因此,
foos = [imp.load_source(fname.split('.py')[0], FOOS_DIR)
for fname in os.listdir(FOOS_DIR)
if re.match(MOD_REGEX, fname)]
变成
foos = [imp.load_source(fname.split('.py')[0], '%s%s' % (FOOS_DIR, fname))
for fname in os.listdir(FOOS_DIR)
if re.match(MOD_REGEX, fname)]
而且效果很好!
我有一个目录,其中包含任意数量的模块,每个模块只包含一个函数 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'"
根据最佳答案 here,我认为这是可行的方法。如果是,也许我的语法不对?毕竟load_source
真的很宽容:
(pdb) imp.load_source('not_there', FOOS_DIR)
<module 'not_there' from '/home/blah/blah/foos'>
不然我还能少什么?
确实是语法问题!我需要模块文件 的完整路径 ,而不仅仅是它的目录,作为 load_source
:
因此,
foos = [imp.load_source(fname.split('.py')[0], FOOS_DIR)
for fname in os.listdir(FOOS_DIR)
if re.match(MOD_REGEX, fname)]
变成
foos = [imp.load_source(fname.split('.py')[0], '%s%s' % (FOOS_DIR, fname))
for fname in os.listdir(FOOS_DIR)
if re.match(MOD_REGEX, fname)]
而且效果很好!