Python導(dǎo)入模塊的3種方式超級(jí)詳細(xì)講解
前言
很多初學(xué)者經(jīng)常遇到這樣的問(wèn)題,即自定義 Python 模板后,在其它文件中用 import(或 from...import) 語(yǔ)句引入該文件時(shí),Python 解釋器同時(shí)如下錯(cuò)誤:
ModuleNotFoundError: No module named '模塊名'
意思是 Python 找不到這個(gè)模塊名,這是什么原因?qū)е碌哪??要想解決這個(gè)問(wèn)題,讀者要先搞清楚 Python 解釋器查找模塊文件的過(guò)程。
通常情況下,當(dāng)使用 import 語(yǔ)句導(dǎo)入模塊后,Python 會(huì)按照以下順序查找指定的模塊文件:
- 在當(dāng)前目錄,即當(dāng)前執(zhí)行的程序文件所在目錄下查找;
- 到 PYTHONPATH(環(huán)境變量)下的每個(gè)目錄中查找;
- 到 Python 默認(rèn)的安裝目錄下查找。
以上所有涉及到的目錄,都保存在標(biāo)準(zhǔn)模塊 sys 的 sys.path 變量中,通過(guò)此變量我們可以看到指定程序文件支持查找的所有目錄。
換句話說(shuō),如果要導(dǎo)入的模塊沒(méi)有存儲(chǔ)在 sys.path 顯示的目錄中,那么導(dǎo)入該模塊并運(yùn)行程序時(shí),Python 解釋器就會(huì)拋出 ModuleNotFoundError(未找到模塊)異常。
解決“Python找不到指定模塊”的方法有 3 種,分別是:
- 向 sys.path 中臨時(shí)添加模塊文件存儲(chǔ)位置的完整路徑;
- 將模塊放在 sys.path 變量中已包含的模塊加載路徑中;
- 設(shè)置 path 系統(tǒng)環(huán)境變量。
不過(guò),在詳細(xì)介紹這 3 種方式之前,為了能更方便地講解,本節(jié)使用前面章節(jié)已建立好的 hello.py 自定義模塊文件(D:\python_module\hello.py)和 say.py 程序文件(C:\Users\mengma\Desktop\say.py,位于桌面上),它們各自包含的代碼如下:
#hello.py def say (): print("Hello,World!") #say.py import hello hello.say()
顯然,hello.py 文件和 say.py 文件并不在同一目錄,此時(shí)運(yùn)行 say.py 文件,其運(yùn)行結(jié)果為:
Traceback (most recent call last):
File "C:\Users\mengma\Desktop\say.py", line 1, in <module>
import hello
ModuleNotFoundError: No module named 'hello'
可以看到,Python 解釋器拋出了 ModuleNotFoundError 異常。接下來(lái),分別用以上 3 種方法解決這個(gè)問(wèn)題。
導(dǎo)入模塊方式一:臨時(shí)添加模塊完整路徑
模塊文件的存儲(chǔ)位置,可以臨時(shí)添加到 sys.path 變量中,即向 sys.path 中添加 D:\python_module(hello.py 所在目錄),在 say.py 中的開(kāi)頭位置添加如下代碼:
import sys sys.path.append('D:\\python_module')
注意:在添加完整路徑中,路徑中的 '\' 需要使用 \ 進(jìn)行轉(zhuǎn)義,否則會(huì)導(dǎo)致語(yǔ)法錯(cuò)誤。再次運(yùn)行 say.py 文件,運(yùn)行結(jié)果如下:
Hello,World!
可以看到,程序成功運(yùn)行。在此基礎(chǔ)上,我們?cè)?say.py 文件中輸出 sys.path 變量的值,會(huì)得到以下結(jié)果:
['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']
該輸出信息中,紅色部分就是臨時(shí)添加進(jìn)去的存儲(chǔ)路徑。需要注意的是,通過(guò)該方法添加的目錄,只能在執(zhí)行當(dāng)前文件的窗口中有效,窗口關(guān)閉后即失效。
導(dǎo)入模塊方式二:將模塊保存到指定位置
如果要安裝某些通用性模塊,比如復(fù)數(shù)功能支持的模塊、矩陣計(jì)算支持的模塊、圖形界面支持的模塊等,這些都屬于對(duì) Python 本身進(jìn)行擴(kuò)展的模塊,這種模塊應(yīng)該直接安裝在 Python 內(nèi)部,以便被所有程序共享,此時(shí)就可借助于 Python 默認(rèn)的模塊加載路徑。
Python 程序默認(rèn)的模塊加載路徑保存在 sys.path 變量中,因此,我們可以在 say.py 程序文件中先看看 sys.path 中保存的默認(rèn)加載路徑,向 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']
上面的運(yùn)行結(jié)果中,列出的所有路徑都是 Python 默認(rèn)的模塊加載路徑,但通常來(lái)說(shuō),我們默認(rèn)將 Python 的擴(kuò)展模塊添加在 lib\site-packages
路徑下,它專門用于存放 Python 的擴(kuò)展模塊和包。
所以,我們可以直接將我們已編寫好的 hello.py 文件添加到 lib\site-packages
路徑下,就相當(dāng)于為 Python 擴(kuò)展了一個(gè) hello 模塊,這樣任何 Python 程序都可使用該模塊。
移動(dòng)工作完成之后,再次運(yùn)行 say.py 文件,可以看到成功運(yùn)行的結(jié)果:
Hello,World!
導(dǎo)入模塊方式三:設(shè)置環(huán)境變量
PYTHONPATH 環(huán)境變量(簡(jiǎn)稱 path 變量)的值是很多路徑組成的集合,Python 解釋器會(huì)按照 path 包含的路徑進(jìn)行一次搜索,直到找到指定要加載的模塊。
當(dāng)然,如果最終依舊沒(méi)有找到,則 Python 就報(bào) ModuleNotFoundError 異常。
由于不同平臺(tái),設(shè)置 path 環(huán)境變量的設(shè)置流程不盡相同,因此接下來(lái)就使用最多的 Windows、Linux、Mac OS X 這 3 個(gè)平臺(tái),給讀者介紹如何設(shè)置 path 環(huán)境變量。
在 Windows 平臺(tái)上設(shè)置環(huán)境變量
首先,找到桌面上的“計(jì)算機(jī)”(或者我的電腦),并點(diǎn)擊鼠標(biāo)右鍵,單擊“屬性”。此時(shí)會(huì)顯示“控制面板\所有控制面板項(xiàng)\系統(tǒng)”窗口,單擊該窗口左邊欄中的“高級(jí)系統(tǒng)設(shè)置”菜單,出現(xiàn)“系統(tǒng)屬性”對(duì)話框,如下圖所示:
如上圖所示,點(diǎn)擊“環(huán)境變量”按鈕,此時(shí)將彈出下圖所示的對(duì)話框:
如上圖所示,通過(guò)該對(duì)話框,就可以完成 path 環(huán)境變量的設(shè)置。需要注意的是,該對(duì)話框分為上下 2 部分,其中上面的“用戶變量”部分用于設(shè)置當(dāng)前用戶的環(huán)境變量,下面的“系統(tǒng)變量”部分用于設(shè)置整個(gè)系統(tǒng)的環(huán)境變量。
通常情況下,建議大家設(shè)置設(shè)置用戶的 path 變量即可,因?yàn)榇嗽O(shè)置僅對(duì)當(dāng)前登陸系統(tǒng)的用戶有效,而如果修改系統(tǒng)的 path 變量,則對(duì)所有用戶有效。
對(duì)于普通用戶來(lái)說(shuō),設(shè)置用戶 path 變量和系統(tǒng) path 變量的效果是相同的,但 Python 在使用 path 變量時(shí),會(huì)先按照系統(tǒng) path 變量的路徑去查找,然后再按照用戶 path 變量的路徑去查找。
這里我們選擇設(shè)置當(dāng)前用戶的 path 變量。單擊用戶變量中的“新建”按鈕, 系統(tǒng)會(huì)彈出如下圖所示的對(duì)話框。
其中,在“變量名”文本框內(nèi)輸入 PYTHONPATH,表明將要建立名為 PYTHONPATH 的環(huán)境變量;在“變量值”文本框內(nèi)輸入 .;d:\python_ module
。
注意,這里其實(shí)包含了兩條路徑(以分號(hào) ;作為分隔符):
- 第一條路徑為一個(gè)點(diǎn)(.),表示當(dāng)前路徑,當(dāng)運(yùn)行 Python 程序時(shí),Python 將可以從當(dāng)前路徑加載模塊;
- 第二條路徑為
d:\python_ module
,當(dāng)運(yùn)行 Python 程序時(shí),Python 將可以從d:\python_ module
中加載模塊。
然后點(diǎn)擊“確定”,即成功設(shè)置 path 環(huán)境變量。此時(shí),我們只需要將模塊文件移動(dòng)到和引入該模塊的文件相同的目錄,或者移動(dòng)到 d:\python_ module
路徑下,該模塊就能被成功加載。
在 Linux 上設(shè)置環(huán)境變量
啟動(dòng) Linux 的終端窗口,進(jìn)入當(dāng)前用戶的 home 路徑下,然后在 home 路徑下輸入如下命令:
ls - a
該命令將列出當(dāng)前路徑下所有的文件,包括隱藏文件。Linux 平臺(tái)的環(huán)境變量是通過(guò) .bash_profile 文件來(lái)設(shè)置的,使用無(wú)格式編輯器打開(kāi)該文件,在該文件中添加 PYTHONPATH 環(huán)境變量。也就是為該文件增加如下一行:
#設(shè)置PYTHON PATH 環(huán)境變量 PYTHONPATH=.:/home/mengma/python_module
Linux 與 Windows 平臺(tái)不一樣,多個(gè)路徑之間以冒號(hào)(:)作為分隔符,因此上面一行同樣設(shè)置了兩條路徑,點(diǎn)(.)代表當(dāng)前路徑,還有一條路徑是 /home/mengma/python_module
(mengma 是在 Linux 系統(tǒng)的登錄名)。
在完成了 PYTHONPATH 變量值的設(shè)置后,在 .bash_profile 文件的最后添加導(dǎo)出 PYTHONPATH 變量的語(yǔ)句。
#導(dǎo)出PYTHONPATH 環(huán)境變量 export PYTHONPATH
重新登錄 Linux 平臺(tái),或者執(zhí)行如下命令:
source.bash_profile
這兩種方式都是為了運(yùn)行該文件,使在文件中設(shè)置的 PYTHONPATH 變量值生效。
在成功設(shè)置了上面的環(huán)境變量之后,接下來(lái)只要把前面定義的模塊(Python 程序)放在與當(dāng)前所運(yùn)行 Python 程序相同的路徑中(或放在 /home/mengma/python_module
路徑下),該模塊就能被成功加載了。
在Mac OS X 上設(shè)置環(huán)境變量
在 Mac OS X 上設(shè)置環(huán)境變量與 Linux 大致相同(因?yàn)?Mac OS X 本身也是類 UNIX 系統(tǒng))。啟動(dòng) Mac OS X 的終端窗口(命令行界面),進(jìn)入當(dāng)前用戶的 home 路徑下,然后在 home 路徑下輸入如下命令:
ls -a
該命令將列出當(dāng)前路徑下所有的文件,包括隱藏文件。Mac OS X 平臺(tái)的環(huán)境變量也可通過(guò),bash_profile 文件來(lái)設(shè)置,使用無(wú)格式編輯器打開(kāi)該文件,在該文件中添加 PYTHONPATH 環(huán)境變量。也就是為該文件增加如下一行:
#設(shè)置PYTHON PATH 環(huán)境變盤 PYTHONPATH=.:/Users/mengma/python_module
Mac OS X 的多個(gè)路徑之間同樣以冒號(hào)(:)作為分隔符,因此上面一行同樣設(shè)置了兩條路徑:點(diǎn)(.)代表當(dāng)前路徑,還有一條路徑是 /Users/mengma/python_module
(memgma 是作者在 Mac OS X 系統(tǒng)的登錄名)。
在完成了 PYTHONPATH 變量值的設(shè)置后,在 .bash_profile 文件的最后添加導(dǎo)出 PYTHONPATH 變量的語(yǔ)句。
#導(dǎo)出PYTHON PATH 環(huán)境變量 export PYTHONPATH
重新登錄 Mac OS X 系統(tǒng),或者執(zhí)行如下命令:
source.bash_profile
這兩種方式都是為了運(yùn)行該文件,使在文件中設(shè)置的 PYTHONPATH 變量值生效。
在成功設(shè)置了上面的環(huán)境變量之后,接下來(lái)只要把前面定義的模塊(Python 程序)放在與當(dāng)前所運(yùn)行 Python 程序相同的路徑中(或放在 Users/mengma/python_module
路徑下),該模塊就能被成功加載了。
總結(jié)
到此這篇關(guān)于Python導(dǎo)入模塊的3種方式的文章就介紹到這了,更多相關(guān)Python導(dǎo)入模塊方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
django寫用戶登錄判定并跳轉(zhuǎn)制定頁(yè)面的實(shí)例
今天小編就為大家分享一篇django寫用戶登錄判定并跳轉(zhuǎn)制定頁(yè)面的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08使用PyQt的QLabel組件實(shí)現(xiàn)選定目標(biāo)框功能的方法示例
這篇文章主要介紹了使用PyQt的QLabel組件實(shí)現(xiàn)選定目標(biāo)框功能的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05pyqt6實(shí)現(xiàn)QTimer定時(shí)器介紹和使用場(chǎng)景
PyQt6中的QTimer是一個(gè)定時(shí)器類,用于在指定的時(shí)間間隔內(nèi)執(zhí)行某個(gè)操作,本文主要介紹了pyqt6實(shí)現(xiàn)QTimer定時(shí)器介紹和使用場(chǎng)景,具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02Python中GPU計(jì)算的庫(kù)pycuda的使用
本文主要介紹了Python中GPU計(jì)算的庫(kù)pycuda的使用,詳細(xì)介紹了PyCUDA 庫(kù)的特性、用法,并通過(guò)豐富的示例代碼展示其在實(shí)際項(xiàng)目中的應(yīng)用,感興趣的可以了解一下2024-05-05利用python抓取HTML頁(yè)面數(shù)據(jù)并作可視化數(shù)據(jù)分析
這篇文章主要為大家詳細(xì)介紹了如何利用python抓取HTML頁(yè)面數(shù)據(jù)并作可視化數(shù)據(jù)分析,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下2025-04-04淺談Python Opencv中g(shù)amma變換的使用詳解
下面小編就為大家分享一篇淺談Python Opencv中g(shù)amma變換的使用詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04pandas 使用apply同時(shí)處理兩列數(shù)據(jù)的方法
下面小編就為大家分享一篇pandas 使用apply同時(shí)處理兩列數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-04-04