Python黑帽編程2.6 模塊

我們已經學習了如何在你的程序中定義一次函數而重用代碼。如果你想要在其他程序中重用很多函數,那麼你該如何編寫程序呢?你可能已經猜到了,答案是使用模塊。模塊基本上就是一個包含了所有你定義的函數和變數的文件。為了在其他程序中重用模塊,模塊的文件名必須以.py為擴展名。

模塊可以從其他程序 導入以便利用它的功能。這也是我們使用Python標準庫的方法。首先,我們將學習如何使用標準庫模塊。

2.6.1 調用SYS模塊

先上代碼:

#!/usr/bin/python import sys print "The command line arguments are:"for i in sys.argv: print i print "

The PYTHONPATH is", sys.path, "
"

首先,我們利用import語句導入sys模塊。sys模塊包含了與Python解釋器和它的環境有關的函數。

當Python執行import sys語句的時候,它在sys.path變數中所列目錄中尋找sys.py模塊。如果找到了這個文件,這個模塊的主塊中的語句將被運行,然後這個模塊將能夠被你使用。注意,初始化過程僅在我們第一次輸入模塊的時候進行。

sys.argv變數是一個字元串的列表,包含了命令行參數的列表。

sys.path包含輸入模塊的目錄名列表。我們可以觀察到sys.path的第一個字元串是空的——這個空的字元串表示當前目錄也是sys.path的一部分,這與PYTHONPATH環境變數是相同的。這意味著你可以直接輸入位於當前目錄的模塊。否則,你得把你的模塊放在sys.path所列的目錄之一。

下面我們保存這段代碼為module_sys.py,從終端使用python來運行,並輸入參數「test argument」,如下圖所示:

圖2

2.6.2 FROM..IMPORT語句

上面的示例中我們通過sys.argv的方式來獲取argv變數中的內容,那如果我們想直接調用argv,就可以獲取變數內容或進行方法調用,該如何做呢?

可以使用

from sys import argv

語句。

還有一種更簡單的方法

from sys import *

導入sys模塊中所有可用的變數或方法。

一般說來,應該避免使用from..import而使用import語句,因為這樣可以使你的程序更加易讀,也可以避免名稱的衝突。

2.6.3 __NAME__

每個模塊都有一個名稱,在模塊中可以通過語句來找出模塊的名稱。前面說過,當一個模塊被第一次導入的時候,這個模塊的主塊將被運行。假如我們只想在程序本身被使用的時候運行主塊,而在它被別的模塊輸入的時候不運行主塊,我們該怎麼做呢?這可以通過模塊的__name__屬性完成。

#!/usr/bin/python if __name__ == "__main__": print "This program is being run by itself"else: print "I am being imported from another module"

每個Python模塊都有它的__name__,如果它是"__main__",這說明這個模塊被用戶單獨運行,我們可以進行相應的恰當操作。

我們直接運行該腳本,運行結果如下:

圖3

2.6.4 創建模塊

創建你自己的模塊是十分簡單的,你一直在這樣做!每個以.py結尾的文件都是一個模塊。

下面我們先創建一個myModule.py的文件,內容如下:

#!/usr/bin/pythondef sayhi(): print "Hi, this is mymodule speaking."version = "0.1"

從上面的代碼可以看到,它與我們普通的Python程序相比並沒有什麼特別之處。我們接下來將看看如何在我們別的Python程序中使用這個模塊。

這個模塊應該被放置在我們導入它的程序的同一個目錄中,或者在sys.path所列目錄之一。

測試代碼如下:

#!/usr/bin/python import mymodule mymodule.sayhi()print "Version", mymodule.version

運行結果如下:

圖4

2.6.5 DIR()函數

我們可以使用內建的dir函數來列出模塊定義的標識符。標識符有函數、類和變數。當為dir()提供一個模塊名的時候,它返回模塊定義的名稱列表。如果不提供參數,它返回當前模塊中定義的名稱列表。

先看下面的代碼:

#!/usr/bin/python import sys print dir(sys) a=5print dir()del aprint dir()

首先,我們來看一下在輸入的sys模塊上使用dir。我們看到它包含一個龐大的屬性列表。如下圖:

圖5

接下來,我們不給dir函數傳遞參數,默認地,它返回當前模塊的屬性列表。

為了觀察dir的作用,我們定義一個新的變數a並且給它賦一個值,然後檢驗dir,我們觀察到在列表中增加了以上相同的值。我們使用del語句刪除當前模塊中的變數/屬性,這個變化再一次反映在dir的輸出中。結果如下:

圖6

2.5.9 小結

模塊的用處在於它能為你在別的程序中重用它提供的服務和功能。Python附帶的標準庫就是這樣一組模塊的例子。我們已經學習了如何使用這些模塊以及如何創造我們自己的模塊。

下一節我們學習異常處理。

2.7節《異常處理》已經在微信訂閱號搶先發布,心急的同學進入訂閱號(二維碼在下方),從菜單網路安全」—>」Python黑帽編程進入即可。

由於教程仍在創作過程中,在整套教程完結前,感興趣的同學請關注我的微信訂閱號(xuanhun521,下方二維碼),我會第一時間在訂閱號推送圖文教程和視頻教程。問題討論請加qq群:Hacking (1群):303242737 Hacking (2群):147098303。

· 點擊打開二維碼


推薦閱讀:

TAG:Python | 模块 | 玄魂工作室 |