1. 程式人生 > 實用技巧 >Python動態匯入模組、類、屬性

Python動態匯入模組、類、屬性

簡單示例

檔案結構
a #資料夾
 │a.py
b #資料夾
 │b.py
 ├─c#資料夾
  │c.py

c.py

args = {'a':1}
class C:
    
    def c(self):
        pass

a.py

import importlib
params = importlib.import_module('b.c.c') #絕對匯入
params_ = importlib.import_module('.c.c',package='b') #相對匯入
# 物件中取出需要的物件
params.args #取出變數
params.C  #
取出class C params.C.c #取出class C 中的c 方法

一個實際的示例 從url傳參中獲取引數,動態匯入模組
from flask import Flask,request
import importlib
import unittest

app = Flask(__name__)
@app.route('/testcase/')
def testcase():
requests = request.args # 獲取所有接收到的引數。
print(requests.get('file'))
filename = requests.get('file')
print(requests.get('class'))
clasname = requests.get('class')
print(requests.get('func'))
funcname = requests.get('func')
moud,clas = dynamicimport(filename,clasname)

# # 構造測試集
suite = unittest.TestSuite()
suite.addTest(clas(funcname))
# 執行測試
runner = unittest.TextTestRunner()
runner.run(suite)
return '<h1>Hello World!</h1>'


def dynamicimport(filename,clasname):
# 動態匯入包
moud = importlib.import_module('testcase.%s' % filename, package='testcase')
# 例項化類
clas = getattr(moud, clasname)

## 獲取類下的具體屬性
# test = getattr(clas(), funcname)
## 遍歷
# atts = dir(clas) # 獲得case屬性
# for att in atts:
# if 'test_' in att:
# print('%s running......' % att)
# test = getattr(clas(), att)() # 執行含有‘test_’的方法
# print('%s is complete' % att)
return moud,clas

if __name__ == '__main__':
app.run(host='127.0.0.1',port=8080,debug=True)