Python - 导入目录树中的所有文件
我想要导入一个目录树中的所有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中,有什么简单好用的方法来实现这个吗?
2 个回答
0
在编程中,有时候我们会遇到一些问题,可能是因为代码写得不够好,或者是我们对某些概念理解得不够透彻。比如,有人可能会在使用某个功能时,发现它并没有按照预期的方式工作。这时候,我们就需要仔细检查代码,看看是不是哪里出了问题。
另外,编程的世界里有很多工具和库可以帮助我们更轻松地完成任务,但有时候这些工具的使用方法可能会让人感到困惑。为了更好地理解这些工具,我们可以查阅相关的文档,或者向其他程序员请教。
总之,编程是一门需要不断学习和实践的技能,遇到问题时不要气馁,慢慢来,总会找到解决办法的。
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]
0
这里有一个简单粗暴的版本,使用了 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)