所以我有一个嵌套文件夹,其中有执行某些操作的模块。
注意:它们不是类,只是脚本。
我想迭代这些模块。
我现在拥有的:
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
这就是我的目录的样子,我的代码是这样写的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_”开头的文件
并执行每个中的主要功能。我基本上知道怎么做但是我没有找到这种迭代的好的解决方案。
我需要动态地从脚本获取模块。这样即使有人添加模块我也不需要更改这里的代码。
有没有类似的东西:
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}'
提前致谢
是的,有多种方法,具体取决于您的具体需求。
例如,您可以获取目录中模块名称的列表,然后使用内置函数导入它们__import__('...') https://docs.python.org/3/library/functions.html#__import__像这样:
for module_name in list:
mod = __import__(module_name)
mod.main(module_name + "_test.csv)
另一方面,如果您已经导入了模块,则可以通过查看来找到它们sys.modules
(这是所有当前导入模块的字典)。
import sys
for name in sys.modules:
if name.startswith("train_"):
mod = sys.modules[name]
mod.main(name + "_test.csv")
UPDATE:这是一个更完整的版本,它遍历目录结构并查找以以下开头的所有 Python 模块train_
,导入它们,并执行它们main
-功能。
import os
for dir in os.scandir('.'):
if dir.is_dir():
for file in os.scandir(dir.path):
if file.name.startswith('train') and file.name.endswith('.py'):
name = file.name[:-3] # without the '.py' at the end
package = __import__(dir.name + '.' + name)
mod = getattr(package, name)
mod.main()
请注意,__import__
函数返回基本包(即scripts
在你的情况下),所以我们必须通过检索我们想要的模块getattr()
first.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)