【问题标题】:Trouble with imp.load_source: 'module' has no attribute 'foo'imp.load_source 的问题:“模块”没有属性“foo”
【发布时间】:2016-01-15 17:48:04
【问题描述】:

我有一个目录,其中包含任意数量的模块,每个模块只包含一个函数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'>

否则,我会错过什么?

【问题讨论】:

    标签: python import module imp python-importlib


    【解决方案1】:

    确实是语法问题!我需要模块文件的完整路径,而不仅仅是它的目录,作为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)] 
    

    而且效果很好!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-11
      • 2020-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 2017-05-13
      • 1970-01-01
      相关资源
      最近更新 更多