在Python中,一個 .py
文件就是一個模塊(Module)。python
爲了不模塊名衝突,Python又引入了按目錄來組織模塊的方法,稱爲包(Package)。web
mycompany ├─ web │ ├─ __init__.py │ ├─ utils.py │ └─ www.py ├─ __init__.py ├─ abc.py ├─ xyz.py └─ utils.py
引入了包之後,只要頂層的包名不與別人衝突,那全部模塊都不會與別人衝突。函數
如今,abc.py
模塊的名字就變成了mycompany.abc
,xyz.py
的模塊名變成了mycompany.xyz
;www.py
模塊的名字就變成了mycompany.web.www
,兩個文件utils.py
的模塊名分別是mycompany.utils
和mycompany.web.utils
。測試
每個包目錄下面都會有一個__init__.py
的文件,這個文件是必須存在的,不然,Python就把這個目錄當成普通目錄,而不是一個包。__init__.py
能夠是空文件,也能夠有Python代碼。編碼
模塊名不能和系統模塊名衝突,最好先查看系統是否已存在該模塊,查看方法是在Python交互環境中執行import abc
,若成功則說明系統已經存在此模塊。命令行
編寫一個 hello.py 模塊:code
#!/usr/bin/env python3 # -*- coding: utf-8 -*- ' a test module ' __author__ = 'Michael Liao' import sys def test(): args = sys.argv if len(args)==1: print('Hello, world!') elif len(args)==2: print('Hello, %s!' % args[1]) else: print('Too many arguments!') if __name__=='__main__': test()
第1行是標準註釋,可讓這個 .py
文件直接在 Unix/Linux/Mac 上運行;utf-8
第2行是標準註釋,表示 .py
文件使用標準UTF-8編碼;ci
第4行是一個字符串,表示模塊的文檔註釋,任何模塊代碼的第一個字符串都被視爲模塊的文檔註釋;文檔
第6行使用 __author__
特殊變量記錄做者名稱;
第8行導入系統內建的sys
模塊,sys
模塊有一個 argv
變量,用list存儲了命令行的全部參數。argv
至少有一個元素,第一個參數永遠是該 .py 文件的名稱。
運行python3 hello.py
得到的sys.argv
就是['hello.py']
;運行
python3 hello.py Wu
得到的sys.argv
就是['hello.py', 'Wu']
。
最後兩行代碼的意義爲:當咱們在命令行運行 hello
模塊文件時,Python解釋器把一個特殊變量 __name__
置爲 __main__
,而若是在其餘地方導入該hello
模塊時則不會設置,所以這種if
測試可讓一個模塊經過命令行運行時執行一些額外的代碼,最多見的就是運行測試。
咱們能夠用命令行運行 hello.py
看看效果:
$ python3 hello.py Hello, world! $ python hello.py Wu Hello, Wu!
若是啓動Python交互環境,再導入hello
模塊:
$ python3 >>> import hello >>>
導入時,沒有打印 Hello, word!
,由於沒有執行test()
函數。
這時候須要調用 hello.test()
,才能打印出Hello, word!
:
>>> hello.test() Hello, world!