簡介模組

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 *

importfrom 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']
>>>

分享到 LinkedIn 分享到 Facebook 分享到 Twitter