首頁 > 軟體

Python匯入模組的3種方式小結

2023-03-11 06:00:27

很多初學者經常遇到這樣的問題,即自定義 Python 模板後,在其它檔案中用 import(或 from...import) 語句引入該檔案時,Python 直譯器同時如下錯誤:

ModuleNotFoundError: No module named '模組名'

意思是 Python 找不到這個模組名,這是什麼原因導致的呢?要想解決這個問題,讀者要先搞清楚 Python 直譯器查詢模組檔案的過程。

通常情況下,當使用 import 語句匯入模組後,Python 會按照以下順序查詢指定的模組檔案:

  • 在當前目錄,即當前執行的程式檔案所在目錄下查詢;
  • 到 PYTHONPATH(環境變數)下的每個目錄中查詢;
  • 到 Python 預設的安裝目錄下查詢。

以上所有涉及到的目錄,都儲存在標準模組 sys 的 sys.path 變數中,通過此變數我們可以看到指定程式檔案支援查詢的所有目錄。

換句話說,如果要匯入的模組沒有儲存在 sys.path 顯示的目錄中,那麼匯入該模組並執行程式時,Python 直譯器就會丟擲 ModuleNotFoundError(未找到模組)異常。

解決“Python找不到指定模組”的方法有 3 種,分別是:

  • 向 sys.path 中臨時新增模組檔案儲存位置的完整路徑;
  • 將模組放在 sys.path 變數中已包含的模組載入路徑中;
  • 設定 path 系統環境變數。

不過,在詳細介紹這 3 種方式之前,為了能更方便地講解,本節使用前面章節已建立好的 hello.py 自定義模組檔案(D:python_modulehello.py)和 say.py 程式檔案(C:UsersmengmaDesktopsay.py,位於桌面上),它們各自包含的程式碼如下:

#hello.py
def say ():
    print("Hello,World!")
#say.py
import hello
hello.say()

顯然,hello.py 檔案和 say.py 檔案並不在同一目錄,此時執行 say.py 檔案,其執行結果為:

 Traceback (most recent call last):
  File "C:UsersmengmaDesktopsay.py", line 1, in <module>
    import hello
ModuleNotFoundError: No module named 'hello'

可以看到,Python 直譯器丟擲了 ModuleNotFoundError 異常。接下來,分別用以上 3 種方法解決這個問題。

匯入模組方式一:臨時新增模組完整路徑

模組檔案的儲存位置,可以臨時新增到 sys.path 變數中,即向 sys.path 中新增 D:python_module(hello.py 所在目錄),在 say.py 中的開頭位置新增如下程式碼:

import sys
sys.path.append('D:\python_module')

注意:在新增完整路徑中,路徑中的 '' 需要使用 進行跳脫,否則會導致語法錯誤。再次執行 say.py 檔案,執行結果如下:

Hello,World!

可以看到,程式成功執行。在此基礎上,我們在 say.py 檔案中輸出 sys.path 變數的值,會得到以下結果:

['C:\Users\mengma\Desktop', 'D:\python3.6\Lib\idlelib', 'D:\python3.6\python36.zip', 'D:\python3.6\DLLs', 'D:\python3.6\lib', 'D:\python3.6', 'C:\Users\mengma\AppData\Roaming\Python\Python36\site-packages', 'D:\python3.6\lib\site-packages', 'D:\python3.6\lib\site-packages\win32', 'D:\python3.6\lib\site-packages\win32\lib', 'D:\python3.6\lib\site-packages\Pythonwin', 'D:\python_module']

該輸出資訊中,紅色部分就是臨時新增進去的儲存路徑。需要注意的是,通過該方法新增的目錄,只能在執行當前檔案的視窗中有效,視窗關閉後即失效。

匯入模組方式二:將模組儲存到指定位置

如果要安裝某些通用性模組,比如複數功能支援的模組、矩陣計算支援的模組、圖形介面支援的模組等,這些都屬於對 Python 本身進行擴充套件的模組,這種模組應該直接安裝在 Python 內部,以便被所有程式共用,此時就可藉助於 Python 預設的模組載入路徑。

Python 程式預設的模組載入路徑儲存在 sys.path 變數中,因此,我們可以在 say.py 程式檔案中先看看 sys.path 中儲存的預設載入路徑,向 say.py 檔案中輸出 sys.path 的值,如下所示:

['C:\Users\mengma\Desktop', 'D:\python3.6\Lib\idlelib', 'D:\python3.6\python36.zip', 'D:\python3.6\DLLs', 'D:\python3.6\lib', 'D:\python3.6', 'C:\Users\mengma\AppData\Roaming\Python\Python36\site-packages', 'D:\python3.6\lib\site-packages', 'D:\python3.6\lib\site-packages\win32', 'D:\python3.6\lib\site-packages\win32\lib', 'D:\python3.6\lib\site-packages\Pythonwin']

上面的執行結果中,列出的所有路徑都是 Python 預設的模組載入路徑,但通常來說,我們預設將 Python 的擴充套件模組新增在 libsite-packages 路徑下,它專門用於存放 Python 的擴充套件模組和包。

所以,我們可以直接將我們已編寫好的 hello.py 檔案新增到  libsite-packages 路徑下,就相當於為 Python 擴充套件了一個 hello 模組,這樣任何 Python 程式都可使用該模組。

移動工作完成之後,再次執行 say.py 檔案,可以看到成功執行的結果:

Hello,World!

匯入模組方式三:設定環境變數

PYTHONPATH 環境變數(簡稱 path 變數)的值是很多路徑組成的集合,Python 直譯器會按照 path 包含的路徑進行一次搜尋,直到找到指定要載入的模組。

當然,如果最終依舊沒有找到,則 Python 就報 ModuleNotFoundError 異常。

由於不同平臺,設定 path 環境變數的設定流程不盡相同,因此接下來就使用最多的 Windows、Linux、Mac OS X 這 3 個平臺,給讀者介紹如何設定 path 環境變數。

在 Windows 平臺上設定環境變數

首先,找到桌面上的“計算機”(或者我的電腦),並點選滑鼠右鍵,單擊“屬性”。此時會顯示“控制面板所有控制面板項系統”視窗,單擊該視窗左邊欄中的“高階系統設定”選單,出現“系統屬性”對話方塊,如下圖所示:

如上圖所示,點選“環境變數”按鈕,此時將彈出下圖所示的對話方塊:

如上圖所示,通過該對話方塊,就可以完成 path 環境變數的設定。需要注意的是,該對話方塊分為上下 2 部分,其中上面的“使用者變數”部分用於設定當前使用者的環境變數,下面的“系統變數”部分用於設定整個系統的環境變數。

通常情況下,建議大家設定設定使用者的 path 變數即可,因為此設定僅對當前登陸系統的使用者有效,而如果修改系統的 path 變數,則對所有使用者有效。

對於普通使用者來說,設定使用者 path 變數和系統 path 變數的效果是相同的,但 Python 在使用 path 變數時,會先按照系統 path 變數的路徑去查詢,然後再按照使用者 path 變數的路徑去查詢。

這裡我們選擇設定當前使用者的 path 變數。單擊使用者變數中的“新建”按鈕, 系統會彈出如下圖所示的對話方塊。

其中,在“變數名”文字方塊內輸入 PYTHONPATH,表明將要建立名為 PYTHONPATH 的環境變數;在“變數值”文字方塊內輸入 .;d:python_ module

注意,這裡其實包含了兩條路徑(以分號 ;作為分隔符):

  • 第一條路徑為一個點(.),表示當前路徑,當執行 Python 程式時,Python 將可以從當前路徑載入模組;
  • 第二條路徑為 d:python_ module,當執行 Python 程式時,Python 將可以從 d:python_ module 中載入模組。

然後點選“確定”,即成功設定 path 環境變數。此時,我們只需要將模組檔案移動到和引入該模組的檔案相同的目錄,或者移動到 d:python_ module 路徑下,該模組就能被成功載入。

在 Linux 上設定環境變數

啟動 Linux 的終端視窗,進入當前使用者的 home 路徑下,然後在 home 路徑下輸入如下命令:

ls - a

該命令將列出當前路徑下所有的檔案,包括隱藏檔案。Linux 平臺的環境變數是通過 .bash_profile 檔案來設定的,使用無格式編輯器開啟該檔案,在該檔案中新增 PYTHONPATH 環境變數。也就是為該檔案增加如下一行:

#設定PYTHON PATH 環境變數
PYTHONPATH=.:/home/mengma/python_module

Linux 與 Windows 平臺不一樣,多個路徑之間以冒號(:)作為分隔符,因此上面一行同樣設定了兩條路徑,點(.)代表當前路徑,還有一條路徑是 /home/mengma/python_module(mengma 是在 Linux 系統的登入名)。

在完成了 PYTHONPATH 變數值的設定後,在 .bash_profile 檔案的最後新增匯出 PYTHONPATH 變數的語句。

#匯出PYTHONPATH 環境變數
export PYTHONPATH

重新登入 Linux 平臺,或者執行如下命令:

source.bash_profile

這兩種方式都是為了執行該檔案,使在檔案中設定的 PYTHONPATH 變數值生效。

在成功設定了上面的環境變數之後,接下來只要把前面定義的模組(Python 程式)放在與當前所執行 Python 程式相同的路徑中(或放在 /home/mengma/python_module 路徑下),該模組就能被成功載入了。

在Mac OS X 上設定環境變數

在 Mac OS X 上設定環境變數與 Linux 大致相同(因為 Mac OS X 本身也是類 UNIX 系統)。啟動 Mac OS X 的終端視窗(命令列介面),進入當前使用者的 home 路徑下,然後在 home 路徑下輸入如下命令:

ls -a

該命令將列出當前路徑下所有的檔案,包括隱藏檔案。Mac OS X 平臺的環境變數也可通過,bash_profile 檔案來設定,使用無格式編輯器開啟該檔案,在該檔案中新增 PYTHONPATH 環境變數。也就是為該檔案增加如下一行:

#匯出PYTHON PATH 環境變數
export PYTHONPATH

Mac OS X 的多個路徑之間同樣以冒號(:)作為分隔符,因此上面一行同樣設定了兩條路徑:點(.)代表當前路徑,還有一條路徑是 /Users/mengma/python_module(memgma 是作者在 Mac OS X 系統的登入名)。

在完成了 PYTHONPATH 變數值的設定後,在 .bash_profile 檔案的最後新增匯出 PYTHONPATH 變數的語句。

#匯出PYTHON PATH 環境變數
export PYTHONPATH

重新登入 Mac OS X 系統,或者執行如下命令:

source.bash_profile

這兩種方式都是為了執行該檔案,使在檔案中設定的 PYTHONPATH 變數值生效。

在成功設定了上面的環境變數之後,接下來只要把前面定義的模組(Python 程式)放在與當前所執行 Python 程式相同的路徑中(或放在 Users/mengma/python_module 路徑下),該模組就能被成功載入了。

到此這篇關於Python匯入模組的3種方式小結的文章就介紹到這了,更多相關Python匯入模組內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com