天天看點

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]
           

暫且寫這些,往後有空再改進一下,以上每個類、方法、内置函數都比較基礎還需自行了解