匯入模組


接續 簡介模組 的內容。sys.path陣列中的字串元素其實是由幾個來源所組成:所執行檔案(模組)的所在目錄、PYTHONPATH環境變數的內容、標準程式庫搜尋目錄、.pth檔案中所列出的目錄。

例如,若在Windows上,有個模組檔案位於C:\workspace,而Python安裝於C:\winware\python31:
import sys
print(sys.path)

若你如下執行程式:
C:\workspace>c:\winware\python31\python demo.py
['C:\workspace', 'C:\Windows\system32\python31.zip', 'c:\winware\python31\
\DLLs', 'c:\winware\python31\lib', 'c:\winware\python31\lib\plat-win', 'c
:\winware\python31', 'c:\winware\python31\lib\site-packages']

C:\workspace>set PYTHONPATH=C:\lib

C:\workspace>c:\winware\python31\python demo.py
['C:\workspace', 'C:\lib', 'C:\Windows\system32\python31.zip', 'c:\winware
\python31\DLLs', 'c:\winware\python31\lib', 'c:\winware\ython31\lib\pl
at-win', 'c:\winware\python31', 'c:\winware\python31\lib\site-packages']

C:\workspace>


C:\workspace是所執行檔案所在目錄、C:\lib是PYTHONPATH的設定內容,其它是標準程式庫搜尋目錄,至於.pth檔案所列出的目錄,是指你可以在Python安裝目錄,或者是安裝目錄的lib\site-packages目錄中建立.pth檔案,當中一行一行列出搜尋模組檔案的目錄,如果該目錄確實存在,則會列為sys.path的內容。例如,若在C:\winware\python31中放置mydir.pth,內容如下:
C:\lib2
C:\lib3

而在c:\winware\python31\lib\site-packages中放置一個mydir.pth,內容如下:
C:\lib4
C:\lib5

如果所列的目錄確實存在,則再度執行demo.py,會顯示如下:
C:\workspace>c:\winware\python31\python demo.py
['C:\workspace', 'C:\lib', 'C:\Windows\system32\python31.zip', 'C:\Winware
\Python31\DLLs', 'C:\Winware\Python31\lib', 'C:\Winware\Python31\lib\pl
at-win', 'C:\Winware\Python31', 'C:\lib2', 'C:\lib3', 'C:\Winware\Python31
\lib\site-packages', 'C:\lib4', 'C:\lib5']

C:\workspace>


import會在sys.path中尋找.py或已編譯的.pyc,如果.py尚未編譯則編譯為.pyc,而後載入執行一次,再次import同一個模組並不會再執行一次模組,如果找到.py與.pyc,而.pyc的版本並沒有比.py舊,則略過編譯直接執行,如果僅找到.pyc而沒有找到.py,也會直接執行。

在執行時期,你可以動態地改變sys.path的內容,來改變搜尋模組的路徑。例如,若有個superman.py放在C:\library中,而superman.py的內容如下:
print('superman modulle')
name = 'Justin'

而你執行的檔案為:
import sys
print(sys.path, end='\n\n')

sys.path.append('c:\library')
print(sys.path, end='\n\n')

import superman
print(superman.name)

則執行的結果會是:
C:\workspace>c:\winware\python31\python demo.py
['C:\workspace', 'C:\lib', 'C:\Windows\system32\python31.zip', 'C:\Winware
\Python31\DLLs', 'C:\Winware\Python31\lib', 'C:\Winware\Python31\lib\pl
at-win', 'C:\Winware\Python31', 'C:\Winware\Python31\ib\site-packages']

['C:\workspace', 'C:\lib', 'C:\Windows\system32\python31.zip', 'C:\Winware
\Python31\DLLs', 'C:\Winware\Python31\lib', 'C:\Winware\Python31\lib\pl
at-win', 'C:\Winware\Python31', 'C:\Winware\Python31\lib\site-packages', '
c:\library']

superman modulle
Justin

C:\workspace>


Python的import是執行時期的運算,import某個模組,就會執行該模組中定義的內容,被import的模組名稱會成為目前模組的變數,而被import的模組中的變數,就是以被import模組名稱為名稱空間。