if __name__== "__main__" 的意思(作用)python代碼復用 轉自:大步's Blog http://www.dabu.info/if-__-namelxx_-main__-mean-function-python-code-reuse.html 有人在學習python腳本時 ...
if __name__== "__main__" 的意思(作用)python代碼復用
轉自:大步's Blog http://www.dabu.info/if-__-name__-__main__-mean-function-python-code-reuse.html
有人在學習python腳本時會發現有的腳本下麵有幾行代碼;
1 2 | if __name__== "__main__": main() |
不明白其中的意思,其實這就是方便我們代碼復用的,我們可以在其他腳本方便的調用另外一個腳本裡面的函數。
假設下載我有下麵一個python代碼,叫做: pysysinfo.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #!/usr/bin/env python #A system information gathering script import subprocess #command 1 //這段代碼是查詢系統信息的 uname = "uname" uname_arg = "-a" print "gathering system information with $s command:\n" % uname subprocess.call([uname,uname_arg]) #command 2 //這段代碼是查詢磁碟分區使用情況的 diskspace = "df" diskspace_arg = "-h" print "gathering diskspace information %s command:\n" % diskspace subprocess.call([diskspace,diskspace_arg]) |
但是如果我們只想用其中第一段command 1的代碼查詢系統信息,怎麼辦呢?難道把這個腳本的後面command 2代碼刪除?that is foolish!!還有一個好的方法就是可以去將上面的代碼功能封裝成模塊,然後通過模塊調用其中的函數,方便我們多次調用,而又不需要重新改寫代碼。下麵是將上面的代碼封裝好,函數化,放到模塊中的改進腳本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | #!/usr/bin/env python #A system information gathering script import subprocess #command 1 def uname_func() uname = "uname" uname_arg = "-a" print "gathering system information with $s command:\n" % uname subprocess.call([uname,uname_arg]) #command 2 def disk_func() diskspace = "df" diskspace_arg = "-h" print "gathering diskspace information %s command:\n" % diskspace subprocess.call([diskspace,diskspace_arg]) #main function that call other functions def main() uname_fun() diskspace_fun() main() |
問題是當我們要調用其中的函數的時候,如何讓腳本知道是我們到底是想讓它直接運行還是只是作為模塊引入另外一個腳本呢?.py有兩種使用方式,一種是作為模塊被調用,另外一種是直接運行。那麼如何判斷呢?於是就有了以下改進!!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #!/usr/bin/env python #A system information gathering script import subprocess #command 1 def uname_func() uname = "uname" uname_arg = "-a" print "gathering system information with $s command:\n" % uname subprocess.call([uname,uname_arg]) #command 2 def disk_func() diskspace = "df" diskspace_arg = "-h" print "gathering diskspace information %s command:\n" % diskspace subprocess.call([diskspace,diskspace_arg]) #main function that call other functions def main() uname_fun() diskspace_fun() if __name__== "__main__": main() |
在main()函數前加入了一個判斷語句,以此來讓腳本判斷自己是被當做模塊調用,還是被直接運行的。當被import作為模塊調用的時候,if以下的代碼就不會被執行,也就是說main()函數不會被執行。
為了更好說明,引用下麵一篇文章來讓我們更加明白
《python中if __name__ == '__main__': 的解析》
模塊是對象,並且所有的模塊都有一個內置屬性 __name__。一個模塊的 __name__ 的值取決於您如何應用模塊。如果 import 一個模塊,那麼模塊__name__ 的值通常為模塊文件名,不帶路徑或者文件擴展名。但是您也可以像一個標準的程式樣直接運行模塊,在這 種情況下, __name__ 的值將是一個特別預設"__main__"。
///////////////////////////////////////////////////////////////////////////////////////////////////
在cmd 中直接運行.py文件,則__name__的值是'__main__';
而在import 一個.py文件後,__name__的值就不是'__main__'了;
從而用if __name__ == '__main__'來判斷是否是在直接運行該.py文件
如:
#Test.py
class Test:
def __init(self):pass
def f(self):print 'Hello, World!'
if __name__ == '__main__':
Test().f()
#End
你在cmd中輸入:
C:>python Test.py
Hello, World!
說明:"__name__ == '__main__'"是成立的
你再在cmd中輸入:
C:>python
>>>import Test
>>>Test.__name__ #Test模塊的__name__
'Test'
>>>__name__ #當前程式的__name__
'__main__'
無論怎樣,Test.py中的"__name__ == '__main__'"都不會成立的!
所以,下一行代碼永遠不會運行到!
通過這篇文章,我們知道,.py文件會根據自身的使用方式,它的__name__的屬性會不同。如果他的屬性是“__main__”,那麼腳本就知道自己是被直接執行的。如果是被別的文件import的來用,__name__的屬性就會是腳本自己的文件名,從而防止錯誤的執行。引入的if語句的作用就是 通過檢查該模塊的__name__屬性來實現判斷.py文件被使用的方式。從而方便我們代碼復用,也可以測試模塊。