簡介模組
April 8, 2022在〈Hello, Python〉最後,撰寫了第一個 .py 檔案,練習了第一個 Python 原始碼檔案的撰寫,這邊來看看更多的入門練習。
命令列引數
如果想取得命令列引數(Command line argument),可以使用 sys.argv
,例如:
import sys
print('Hello, ' + sys.argv[1])
要取得命令列引數,必須以 import
語句匯入 sys
模組(module),命令列引數字串清單方式收集並指定給 sys.argv
,索引 0 表示為第一個命令列引數,這會是你執行的 .py 檔名,索引 1 則表示第二個命令列引數,依此類推。
接著如下執行指令載入指令稿直譯並執行:
> python hello.py caterpillar
Hello, caterpillar
模組檔案
在 Python 中,一個 .py 檔案就是一個模組,import
就是載入另一個 .py 檔案、直譯,若有頂層程式碼就執行。例如可以先撰寫 some.py 檔案:
name = 'Justin'
print(name)
接著在另一個 .py 檔案或指令互動模式中使用 import
語句,就會看到執行了相關程式碼:
>>> import some
Justin
若使用 CPython,在 import some
時,會載入 some.py、編譯為位元碼、儲存為 .pyc 檔案,下次再匯入模組時,若原始碼並沒有更動且 .pyc 存在,就會直接載入 .pyc 直譯,從而加快了執行的速度。
使用 import
匯入模組後,若有頂層程式碼就會執行,因此上例中看到 some.py 的 print
函式執行結果。
模組是個名稱空間,模組名稱就是主檔名,模組中宣告的變數或函式都是模組的屬性,若要存取模組中的變數或函式等名稱,必須前置模組名稱,例如接續以上範例,如下輸入:
>>> import some
Justin
>>> print(name)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined
>>> print(some.name)
Justin
from import
可以使用 from import
在目前模組中,建立與被匯入模組中某些變數相同的名稱,並將值指定給新建立的變數名稱:
>>> from some import name
>>> print(name)
Justin
>>> name = 'Monica'
>>> print(name)
Monica
上例中的 name
是新建立的名稱,只是被指定了 some
模組中 name
的值,執行 name = 'Monica'
時,只是將 'Monica'
指定給目前模組的 name
名稱,對 some.name
沒有影響:
>>> print(some.name)
Justin
>>>
如果想知道模組公開了哪些名稱,可以使用 dir
函式:
>>> dir(some)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'name']
>>>
在上面看到除了自定義的屬性,還有一些內建的屬性,這之後有機會再深入介紹。
可以一次匯入兩個以上的名稱,例如:
from some import x, y
或者是將模組中的名稱全部匯入,例如:
from some import *
import
或 from import
只會在首次匯入模組時執行模組中的頂層程式碼,重複 import
同一模組,不會重複執行模組的頂層程式碼。
__name__ 名稱
先前談到,可以使用 dir
查詢模組中的名稱,這邊先介紹一下 __name__
名稱。如果使用 python
指令直接執行某個 .py 檔案,__name__
名稱會被設為 '__main__'
,如果是 import
語句匯入模組,__name__
會被設為模組名稱。
因此模組的作者會為了測試模組,寫下這樣的程式碼:
def some(text):
return text + '...processed...'
def main():
fixture = 'orz'
print(some(fixture))
if __name__ == '__main__':
main()
這麼一來,只有在直接使用 python
執行 .py 時,才會呼叫 main
函式並執行測試,若使用 import
匯入模組則不會。
sys.path
在入門階段,可以先知道的是,Python 會在 PYTHONPATH
環境變數設定的路徑中,尋找模組檔案,PYTHONPATH
環境變數的內容會被讀取,成為 sys.path
清單中的字串元素,而這個字串代表的路徑,正是模組檔案尋找的根據:
>>> import sys
>>> sys.path
['', 'C:\\Winware\\python310\\python310.zip', 'C:\\Winware\\python310\\DLLs', 'C:\\Winware\\python310\\lib', 'C:\\Winware\\python310', 'C:\\Winware\\python310\\lib\\site-packages']
>>>