模塊就是程序,任何python程序都可以作為模塊進行導入。模塊用於定義函數和類等。當導入模塊后,會有一個__pycache__子目錄,這個緩存文件目錄包含處理后的文件,能更高效的處理,以后再次導入則使用它。
python包含一組稱為標准庫的模塊,默認在/usr/local/lib/python3.6目錄下(我的python版本是3.6,不同版本位置可能不同)都可以看到,也可以通過導入模塊,然后使用__file__方法來查看模塊的路徑:
模塊導入方法
python中的模塊使用命令import來導入。格式:模塊.函數。也可以使用另外一種形式:from 模塊 import 函數。
在這里我自定義一個模塊hello.py: #cat hello.py
def test1(): print("hello-------one") def test2(): print("hello-------two") test1() test2() 然后創建另一個m.py文件來調用這個模塊: #cat m.py
#模塊導入方式一 import hello hello.test1() hello.test2() #模塊導入方式二 from hello import test1,test2 test1() test2() #模塊導入方式三 from hello import * test1() test2()
盡管可以使用不同的方法來調用模塊,但是發現一個問題,就是被調用模塊中的函數重復運行了。為了避免這個情況,關鍵是檢查模塊是作為程序運行還是被導入另一個程序的,為此需要變量__name__。在主程序中,變量__name__的值為'__main__',而在導入的模塊中,這個變量值被設置為該模塊的名稱,所以可以在模塊中加入一個if語句,if __name__ == '__main__'。
# cat hello.py #!/usr/bin/evn python3 def test1(): print("hello-------one")
def test2(): print("hello-------two") if __name__ == '__main__': test1() test2()
此時再次運行可以發現不會重復出現了:
包
包也是一種模塊,可以包含其他模塊,包是一個目錄。要被python視為包,目錄中必須包含__init__.py文件,包的導入會首先執行__init__.py。其他模塊加入包中,放入包的目錄即可。這里python默認包的路徑為:
/usr/local/lib/python3.6/site-packages。
包的創建使用
創建一個pak目錄,並分別創建__init__.py、test1.py和test2.py三個文件:
# cat test1.py def test1(): print("test1-----") # cat test2.py def test2(): print("test2-----") # cat __init__.py __all__ = ["test1","test2"] from . import *
1)包要想能夠使用,__init__.py文件得添加一句from . import *,意思是從當前包的目錄導入所有模塊文件,因為包的導入會首先執行__init__.py。
2)變量__all__包含一個列表,起到過濾變量、函數和類的作用。因為模塊中可能包含大量的不需要的變量、函數和類,設置__all__,則會在以import *方式導入時,導入所有不以下划線打頭的全局名稱。
當把變量__all__改為了__all__= ["test1"],可以看到test2模塊導入不了:
也可以通過調用變量__all__來查看可以調用的模塊。包的導入方式和模塊一樣也可以通過from 包 import 模塊。
使用help可以查看幫助
使用__doc__查看模塊信息
使用file查看模塊源碼位置
一些常用的模塊:sys、os、fileinput、集合,堆和雙端隊列、time、random、shelve,json、re等等。