python動態導入模塊、函數、類、對象

看kennethreitz寫的pip-pop,運行時發現我的pip版本19.1太高了,需要改一下他的代碼。這個過程就得考慮動態導入了。

以下爲修改後的bin/pip-grep文件開頭部分

import os
from docopt import docopt
import importlib
# from pip.req import parse_requirements
# from pip.index import PackageFinder
# from pip._vendor.requests import session


def pip_import(module, func):
    try:  # for pip >= 10
        mod = importlib.import_module("._internal." + module, 'pip')
    except ImportError:  # for pip <= 9.0.3
        mod = importlib.import_module('.' + module, 'pip') # 動態導入模塊
    return getattr(mod, func)

parse_requirements = pip_import('req', 'parse_requirements')
PackageFinder = pip_import('index', 'PackageFinder')
session = pip_import('_vendor.requests', 'session') # 動態導入函數

requests = session() # 使用導入的函數

經測試可用。

在文件中獲取所在模塊名字,以及模塊中所有對象的方法:

import sys
mod = sys.modules[__name__] # 獲取所在模塊
file = getattr(mod, '__file__', None) # 獲取模塊的文件路徑
#mod = sys.modules['__main__'] # 也可以獲取所在模塊
print("mod:", mod) # <module '__main__' from './bin/pip-grep'>
print("file:", file) # ./bin/pip-grep
print("dir:", dir(mod)) # 獲取模塊中的所有對象名,包含導入的模塊,類,函數,變量等
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章