Python - 导入目录树中的所有文件

0 投票
2 回答
720 浏览
提问于 2025-04-17 23:02

我想要导入一个目录树中的所有Python文件,也就是说,如果我们有以下这样的目录结构:

tests/
tests/foo.py
tests/subtests/bar.py

(想象一下这个树的深度是任意的)。

我想要执行 import_all('tests'),这样就能加载 foo.pybar.py。用通常的模块名称导入(比如 tests.footests.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)

撰写回答