例如,若在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\\python31\\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\\lib\\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模組名稱為名稱空間。
沒有留言:
張貼留言