動態導入模塊


一、正常導入模塊

  正常模塊導入方式: import module(模塊路徑)

  同時導入多個模塊: 

import os,sys,socket

 

二、動態導入模塊

  動態導入模塊允許我們通過字符串形式來導入模塊

  2.1 __import__函數,接受一個字符串參數

import os, sys

my_sys = __import__('sys')
my_os = __import__('os')

print(sys.version)
print(my_sys.version)

print('-------------')
print(os.getcwd())
print(my_os.getcwd())


# 輸出

3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]
3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]
-------------
G:\python\untitled\study8
G:\python\untitled\study8

  我們將sys, os 模塊名當中參數傳入__import__函數中,可以看出my_sys 和my_os 其實就是相當於 os , sys 模塊了。

  2.2 __import__函數導入自己的模塊

  我們在lib包中有一個test.py模塊,我們如何通過__import__函數來導入該模塊呢?  

# test.py內容

class Person(object):

    def __init__(self):
        self.name = 'bigberg' 
# 導入模塊

mod = __import__('lib.test') # 相當於獲取了 lib 的路徑
print(mod)
obj = mod.test.Person()
print(obj.name)


# 輸出

<module 'lib' from 'G:\\python\\untitled\\study8\\lib\\__init__.py'>
bigberg

  2.3 動態導入模塊列表  

moduleNames = ['sys', 'os', 'socket']
print(type(map))
# 在python3 map函數不在是內置函數,而是class,返回的結果是 可迭代對象
print(isinstance(map(__import__, moduleNames), Iterator))

modules = list(map(__import__, moduleNames))

print(modules[0].version)

# 輸出

<class 'type'>
True
3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]

  現在的modules[0] 就相當於 sys 模塊了。

  2.4 importlib 模塊

  動態導入模塊時,python官方建議使用importlib模塊,我們同樣導入lib/test.py 

import importlib

mod = importlib.import_module('lib.test')  # mod相當於 test.py本身了,於上例不同
print(mod)

obj = mod.Person()
print(obj.name)

# 輸出

<module 'lib.test' from 'G:\\python\\untitled\\study8\\lib\\test.py'>
bigberg

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM