1. 程式人生 > >python模塊導入

python模塊導入

測試 重名 med 時也 解釋器 使用 相對導入 全局 全局變量

一、模塊的本質

我們寫python程序經常會導入很多模塊,那到底模塊是什麽呢?其實模塊就是一個python文件,我們導入模塊時的模塊名就是python文件的名字,比如我們寫了一個叫my_module.py的文件就可以當作模塊導入其他python文件中,模塊名就是my_module。

二、模塊導入的兩種方式

2.1、import

2.1.1、import導入模塊時會做三件事:

1、為該模塊生成一個獨立的命名空間

2、在該命名空間中將模塊的代碼執行一遍

3、建立模塊名到該命名空間的引用

2.1.2、別名

當我們導入的模塊名太長不方便調用,或者跟我們自己定義的函數名或變量名有重名的時候怎麽辦呢?這個時候就可以使用as關鍵字給模塊起個別名,之後在帶哦用模塊中的函數或變量時就用這個別名就可以了,比如

import random as r
print(r.randint(1,5))
-------------------------------------------------------------------------------------- 
4

2.1.3、一行導入多個模塊

python支持import後跟多個模塊名,用逗號分割即可

import random ,os,sys

2.2、from import

2.2.1、與import的區別

from import也會為模塊創建獨立的命名空間,但是它直接將import後的名字導入到了當前命名空間,我們可以直接使用這個名字不需要用模塊名.名字的方式了,比如

from collections import namedtuple
Point=nametuple(‘Point‘,[‘x‘,‘y‘])
p=Point(1,2)
print(p.x,p.y)
--------------------------------------------------------------------------------------
1 2

但是需要註意的是,如果後面有跟這個導入的名字重名的情況的話,這個被導入的名字就會被後面的覆蓋了

2.2.2、別名

from import也支持使用as關鍵字給導入的名字起別名,同樣在後續使用時也是使用這個別名了

2.2.3、同時導入一個模塊的多個名字

from import支持一行導入多個名字,比如

from collections import namedtuple,OrderedDict,defaultdict,deque,Counter
Point=namedtuple(‘Point‘,[‘x‘,‘y‘])
p=Point(1,2)
print(p.x,p.y)
--------------------------------------------------------------------------------------
1 2

2.2.4、from import *

from import *可以將模塊中除了下劃線_開頭的變量外的所有名字都導入當前命名空間,同時我們可以配合使用__all__=[‘名字1‘,‘名字2‘]的方式控制哪些名字可以被導入,但是大部分情況下不建議這樣導入,因為我們不知道模塊中有哪些名字,會不會跟現有代碼中的名字重名

三、模塊重新加載

python是不支持重新加載模塊或者卸載已加載的模塊的,因此一旦程序運行後,對模塊的修改都不會生效,一般情況下只能重新啟動程序,但是有一種方法可以在程序運行的時候重新加載模塊,就是importlib模塊的reload方法,在導入了importlib模塊後,我們可以使用importlib.reload(模塊名)的方式重新加載模塊,但是只建議在測試的時候使用。

四、控制模塊的執行邏輯

在python內置的全局變量中有一個__name__的變量,它的值會根據python文件被執行的方式不同而不同,如果python文件是直接執行的那麽它的變量值就是__main__,如果是被當作模塊間接執行的那麽它的變量值就是模塊名,利用這個我們就可以控制一個python文件中的代碼在直接執行時才執行否則就不執行

五、模塊搜索順序

python在搜索模塊時會先找內存中已加載的模塊,然後到內置模塊中查找,最後從sys.path中包含的路徑中按順序查找,這裏我們需要註意一點,我們自己定義的模塊名不要跟內置模塊重名,否則重名的那個內置模塊就無法使用

六、python編譯文件

python解釋器在執行python時會把第一次加載的模塊進行一次編譯生成.pyc的文件,下次就會直接加載這個.pyc文件而不是模塊文件,這樣的好處就是在模塊加載的時候會加快速度,但是默認不會給其他python文件生成.pyc文件,我們可以在運行python文件時用python -m XXX.py的方式讓python給這個python文件也生成一個.pyc的文件

七、包

python中的包其實就是一個包含__init__.py文件的文件夾,我們在導入一個python包的時候實際上就是導入了這個文件而已。

絕對導入:就是在from中指定具體的子模塊路徑,比如from glance.cmd import manage

相對導入:就是用點代表子模塊前的路徑,子模塊外有幾層包就需要幾個點,比如from .cmd import manage。相對導入只能在同一個包內使用並且只有子模塊被其他文件導入執行時才能正常執行。

python模塊導入