2017年10月3日 星期二

[Python 學習筆記] 函式、類別與模組 : 模組 (匯入模組)

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

匯入模組 : 
例如,若在Windows上,有個模組檔案位於 C:\Software\Python3.2.2\tutorial\ClassDefModule\ImportModule,而 Python 安裝於 C:\Software\Python3.2.2\ : 
- demo.py : 
  1. import sys  
  2. print(sys.path)  
若你如下執行程式 : 
 

至於 .pth 檔案所列出的目錄,是指你可以在 Python 安裝目錄,或者是安裝目錄的 lib\site-packages 目錄中建立 .pth 檔案,當中一行一行列出搜尋模組檔案的目錄,如果該目錄確實存在,則會列為 sys.path 的內容. 例如,若在 C:\Software\Python3.2.2\ 中放置 mydir.pth,內容如下 : 
C:\tmp\test1
C:\tmp\test2

而在 C:\Software\Python3.2.2\Lib\site-packages 中放置一個 mydir.pth,內容如下 : 
C:\tmp\test3
C:\tmp\test4

如果所列的目錄確實存在,則再度執行 demo.py,會顯示如下 : 
 

import 會在 sys.path 中尋找 .py 或已編譯的 .pyc,如果 .py 尚未編譯則編譯為 .pyc,而後載入執行一次,再次 import 同一個模組並不會再執行一次模組,如果找到 .py 與 .pyc,而 .pyc 的版本並沒有比 .py 舊,則略過編譯直接執行,如果僅找到 .pyc 而沒有找到 .py,也會直接執行! 在執行時期,你可以動態地改變 sys.path 的內容,來改變搜尋模組的路徑。例如,若有個 superman.py 放在 C:\tmp\test5 中,而 superman.py 的內容如下 : 
  1. print('superman modulle')  
  2. name = 'John'  
而你執行的檔案為 : 
- test1.py : 
  1. import sys  
  2. print(sys.path, end='\n\n')  
  3.   
  4. sys.path.append('C:\\tmp\\test5')  # \\t 轉義 \t  
  5. print(sys.path, end='\n\n')  
  6.   
  7. import superman  
  8. print(superman.name)  
則執行的結果會是 : 
 

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

Supplement 
FAQ - set pythonpath before import statements 

沒有留言:

張貼留言

[Linux 常見問題] What's the best way to send a signal to all members of a process group?

Source From  Here   Question   I want to  kill a whole process tree.  What is the best way to do this using any common scripting languages? ...