1

任意の数のモジュールで満たされたディレクトリがあり、各モジュールには function のみが含まれています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'>

そうでなければ、何が欠けているのでしょうか?

4

1 に答える 1

1

それは確かに構文の問題です!の 2 番目の引数として、ディレクトリだけでなく、モジュール ファイルへのフル パスが必要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)] 

そして、それはうまく機能します!

于 2016-01-15T19:02:39.883 に答える