在Python中迭代模块
因此,我有一个嵌套文件夹,其中有执行某些操作的模块。 注意:它们不是类,只是脚本。 我想重复这些模块。 我现在所拥有的:在Python中迭代模块,python,Python,因此,我有一个嵌套文件夹,其中有执行某些操作的模块。 注意:它们不是类,只是脚本。 我想重复这些模块。 我现在所拥有的: from scripts.module_1 import train_module_1 from scripts.module_2 import train_module_2 from scripts.module_3 import train_module_3 from scripts.module_4 import train_module_4 def te
from scripts.module_1 import train_module_1
from scripts.module_2 import train_module_2
from scripts.module_3 import train_module_3
from scripts.module_4 import train_module_4
def test_train_module_1():
try:
train_module_1.main('test.csv')
except ValueError as value_error:
assert False, "test_train_module_1 failed:" + str(value_error)
...
The same for all train modules
这就是我的dir的样子,我的代码是在my_test.py
中编写的:
tests
my_test.py
scripts
module_1
__init__.py
train_module_1.py
module_1_blabla.py
module_2
__init__.py
train_module_2.py
module_2_blabla.py
...
我想知道我是否可以在每个模块中迭代这些模块
仅获取以“train_u2;”开头的文件
并在每个模块中执行主要功能。我基本上知道怎么做,但是我没有找到一个适合这种迭代的好方法。
我需要动态地从脚本中获取模块。因此,即使有人要添加一个模块,我也不需要在这里更改代码
有没有这样的事情:
for i in scripts.children():
for j in i.children():
if j.__name__.startswith('train_'):
try:
j.main(f'{j.__name__}_test.csv')
except ValueError as value_error:
assert False, f'test_{j.__name__} failed: {value_error}'
提前感谢是的,根据您的具体需要,有几种方法 例如,您可以在目录中获取模块名称列表,然后使用内置函数导入它们,如下所示: 列表中模块名称的
:
mod=\uuuu导入(模块名称)
mod.main(模块名称+“\u test.csv)
另一方面,如果您已经导入了模块,您可以通过查看sys.modules
(这是当前导入的所有模块的字典)来找到它们
导入系统
对于sys.modules中的名称:
如果名称从(“列车”)开始:
mod=sys.modules[名称]
mod.main(名称+“_test.csv”)
更新:这里有一个更完整的版本,它通过目录结构查找所有以train
开头的Python模块,导入它们,并执行它们的main
-函数
导入操作系统
对于os.scandir('.')中的目录:
如果dir.is_dir():
对于os.scandir(dir.path)中的文件:
如果file.name.startswith('train')和file.name.endswith('.py'):
name=file.name[:-3]#结尾不带“.py”
package=_导入__(dir.name+'..+name)
mod=getattr(包,名称)
mod.main()
请注意,
\uuuuu import\uuuuu
函数返回基本包(即在您的情况下为脚本
),因此我们必须首先通过getattr()
检索所需的模块。您需要两件不同的东西:
- 导入一些模块,每个模块只导入一个特定名称
- 从它们执行主功能
importlib
模块可以帮助完成第一部分:
train = {}
for num in '1234':
mod = importlib.import_module('script.module_' + i)
train[i] = getattr(mod, 'train_module_' + i)
然后,您可以轻松地调用它们:
for i, t in train.items():
try:
t.main('test.csv')
except ValueError as value_error:
assert False, f"test_train_module_{i} failed:" + str(value_error)
谢谢,但是那些模块(.py文件)位于不同的目录中。我可以从脚本导入*导入,但是我仍然在目录中。将我的目录映射添加到问题中