天天看点

python根据类的字符串名获取对象以启动类

有这样一个需求:

  • 我有多个脚本,但是我需要将这些脚本打包成进程去运行,但是我不能知道每个Module中的类是什么,这时候该如何去获取每个Module当中的类对象以便于启动这样一个脚本。

模拟问题:

  • 我有三个py文件,里边各自对应有一个类,我需要将这些类run起来
"""Module1.py"""
class A:
	def run(self):
		do something

"""Module2.py"""
class B:
	def run(self):
		do something

"""Module3.py"""
class C:
	def run(self):
		do something
           

以上是我需要去run的三个程序。首先,我是不能确定我有几个Module的,然后,我也不知道每个Module当中有哪些类(或者说类名是什么),但是有一点是我明白的,每一个类的执行主逻辑都写在了run()当中,我的目的就是去启动run()

处理问题

以上问题提出,也同时模拟了情景。以下是我的解决方式。

  • 编写配置文件,因为我在自动处理时不能知道有哪些Module,有哪些class,所以必须编写一个config文件来管理
"""config_.py"""
task_manager = [
	{
		"class_flag": "A",
		"filename" : "Module1",
		"classname": "A",
	},
	{
		"class_flag": "B",
		"filename" : "Module2",
		"classname": "B",
	},
	{
		"class_flag": "C",
		"filename" : "Module3",
		"classname": "C",
	}
]
           
  • 建立一个主程序
"""StartProcesses.py"""
# coding=utf-8

import importlib
import multiprocessing

from config_ import task_manager

Processes = []

for task in task_manager:
	module = importlib.import_module(task["filename"])
	cls = getattr(module, task["classname"])
	Processes.append(multiprocessing.Process(target=cls().run))

[Process.start() for Process in Processes]
[Process.join() for Process in Processes]
           

暂且写这些,往后有空再改进一下,以上每个类、方法、内置函数都比较基础还需自行了解