任意の数のモジュールで満たされたディレクトリがあり、各モジュールには 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'>
そうでなければ、何が欠けているのでしょうか?