在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文件)位于不同的目录中。我可以从脚本导入*导入
,但是我仍然在目录中。将我的目录映射添加到问题中