python import
模塊
通常模塊為一個文件,直接使用import來導入就好了。可以作為module的文件類型有".py"、".pyo"、".pyc"、".pyd"、".so"、".dll"。
包
通常包總是一個目錄,可以使用import導入包,或者from + import來導入包中的部分模塊。包目錄下為首的一個文件便是 __init__.py。然後是一些模塊文件和子目錄,假如子目錄中也有 __init__.py 那麽它就是這個包的子包了。
一模塊
你可以使用import語句將一個源代碼文件作為模塊導入.例如:
# file : spam.py
a = 37 # 一個變量
def foo: # 一個函數
print "I‘m foo"
class bar: # 一個類
def grok(self):
print "I‘m bar.grok"
b = bar() # 創建一個實例
使用import spam 語句就可以將這個文件作為模塊導入。系統在導入模塊時,要做以下三件事:
1.為源代碼文件中定義的對象創建一個名字空間,通過這個名字空間可以訪問到模塊中定義的函數及變量。
2.在新創建的名字空間裏執行源代碼文件.
3.創建一個名為源代碼文件的對象,該對象引用模塊的名字空間,這樣就可以通過這個對象訪問模塊中的函數及變量,如:
import spam # 導入並運行模塊 spam
print spam.a # 訪問模塊 spam 的屬性
spam.foo()
c = spam.bar()
...
用逗號分割模塊名稱就可以同時導入多個模塊:
import socket, os, regex模塊導入時可以使用 as 關鍵字來改變模塊的引用對象名字:
import os as system
import socket as net, thread as threads
system.chdir("..")
net.gethostname()
使用from語句可以將模塊中的對象直接導入到當前的名字空間
from socket import gethostname
# 將gethostname放如當前名字空間
print gethostname() # 直接調用
socket.gethostname() # 引發異常NameError: socket
from語句支持逗號分割的對象,也可以使用星號(*)代表模塊中除下劃線開頭的所有對象:
from socket import gethostname, socket
from socket import * # 載入所有對象到當前名字空間
不過,如果一個模塊如果定義有列表__all__,則from module import * 語句只能導入__all__列表中存在的對象。
# module: foo.py
__all__ = [ ‘bar‘, ‘spam‘ ] # 定義使用 `*` 可以導入的對象
另外, as 也可以和 from 聯合使用:
from socket import gethostname as hostname
h = hostname()
import 語句可以在程序的任何位置使用,你可以在程序中多次導入同一個模塊,但模塊中的代碼*僅僅*在該模塊被首次導入時執行。後面的import語句只是簡單的創建一個到模塊名字空間的引用而已。sys.modules字典中保存著所有被導入模塊的模塊名到模塊對象的映射。這個字典用來決定是否需要使用import語句來導入一個模塊的最新拷貝.
from module import * 語句只能用於一個模塊的最頂層.*特別註意*:由於存在作用域沖突,不允許在函數中使用from 語句。
每個模塊都擁有 __name__ 屬性,它是一個內容為模塊名字的字符串。最頂層的模塊名稱是 __main__ .命令行或是交互模式下程序都運行在__main__ 模塊內部. 利用__name__屬性,我們可以讓同一個程序在不同的場合(單獨執行或被導入)具有不同的行為,象下面這樣做:
# 檢查是單獨執行還是被導入
if __name__ == ‘__main__‘:
# Yes
statements # 執行python腳本時,會調用這部分代碼
else:
# No (可能被作為模塊導入)
statements # 被導入時,會自動調用這部分代碼
python import