我想在目录树中导入所有python文件,即如果我们有以下目录结构:
tests/
tests/foo.py
tests/subtests/bar.py
(假设树的深度是任意的)
我想做import_all('tests')
,加载foo.py
和bar.py
。使用通常的模块名称(tests.foo
和tests.subtests.bar
)导入会很好,但不是必需的。
我的实际用例是,我有一大堆包含django表单的代码;我想确定哪些表单使用特定的字段类。我对上面代码的计划是加载我的所有代码,然后检查所有加载的类以查找表单类。
在python 2.7中有什么好的,简单的方法来完成这个?
这是一个使用os.walk
的粗略版本:
import os
prefix = 'tests/unit'
for dirpath, dirnames, filenames in os.walk(prefix):
trimmedmods = [f[:f.find('.py')] for f in filenames if not f.startswith('__') and f.find('.py') > 0]
for m in trimmedmods:
mod = dirpath.replace('/','.')+'.'+m
print mod
__import__(mod)
import os
my_dir = '/whatever/directory/'
files = [os.path.join(dirpath, f) for dirpath, dirnames, files in os.walk(my_dir) for f in files if f.endswith('.py')]
modules = [__import__(os.path.splitext(f)[0],globals(),locals(),[],-1) for f in files]