在a.py中導(dǎo)入模塊b的時(shí)候,python會做一系列的模塊文件路徑搜索操作:b.py在哪里?只有找到它才能讀取、運(yùn)行(裝載)該模塊。
在任何一個python程序啟動時(shí),都會將模塊的搜索路徑收集到sys模塊的path屬性中(sys.path)。當(dāng)python需要搜索模塊文件在何處時(shí),首先搜索內(nèi)置模塊,如果不是內(nèi)置模塊,則搜索sys.path中的路徑列表,搜索時(shí)會從該屬性列出的路徑中按照從前向后的順序進(jìn)行搜索,并且只要找到就立即停止搜索該模塊文件(也就是說不會后搜索的同名模塊覆蓋先搜索的同名模塊)。
例如,在a.py文件中輸出一下這個屬性的內(nèi)容:
#a.py:
importsys
print(sys.path)
結(jié)果:
['G:\\pycode','C:\\ProgramFiles(x86)\\Python36-32\\python36.zip','C:\\ProgramFiles(x86)\\Python36-32\\DLLs','C:\\ProgramFiles(x86)\\Python36-32\\lib','C:\\ProgramFiles(x86)\\Python36-32','C:\\Users\\malong\\AppData\\Roaming\\Python\\Python36\\site-packages','C:\\ProgramFiles(x86)\\Python36-32\\lib\\site-packages']
python模塊的搜索路徑包括幾個方面,按照如下順序搜索:
程序文件(a.py)所在目錄,即G:\\pycode
環(huán)境變量PYTHONPATH所設(shè)置的路徑(如果定義了該環(huán)境變量,則從左向右的順序搜索)
標(biāo)準(zhǔn)庫路徑
.pth文件中定義的路徑
需要注意,上面sys.path的結(jié)果中,除了.zip是一個文件外,其它的搜索路徑全都是目錄,也就是從這些目錄中搜索模塊X的文件X.py是否存在。
程序所在目錄
這個目錄是最先搜索的,且是python自動搜索的,無需對此進(jìn)行任何設(shè)置。從交互式python程序終輸出sys.path的結(jié)果:
>>>sys.path
['','C:\\WINDOWS\\system32','C:\\ProgramFiles(x86)\\Python36-32\\Lib\\idlelib','C:\\ProgramFiles(x86)\\Python36-32\\python36.zip','C:\\ProgramFiles(x86)\\Python36-32\\DLLs','C:\\ProgramFiles(x86)\\Python36-32\\lib','C:\\ProgramFiles(x86)\\Python36-32','C:\\Users\\malong\\AppData\\Roaming\\Python\\Python36\\site-packages','C:\\ProgramFiles(x86)\\Python36-32\\lib\\site-packages']
其中第一個''表示的就是程序所在目錄。
注意程序所在目錄和當(dāng)前目錄是不同的。例如,在/tmp/目錄下執(zhí)行/pycode中的a.py文件
cd/tmp
python/pycode/a.py
其中/tmp為當(dāng)前目錄,而/pycode是程序文件a.py所在的目錄。如果a.py中導(dǎo)入b.py,那么將首先搜索/pycode,而不是/tmp。
環(huán)境變量PYTHONPATH
這個變量中可以自定義一系列的模塊搜索路徑列表,這樣可以跨目錄搜索(另一種方式是設(shè)置.pth文件)。但默認(rèn)情況下這個環(huán)境變量是未設(shè)置的。
在windows下,設(shè)置PYTHONPATH環(huán)境變量的方式:命令行中輸入:SystemPropertiesAdvanced-->環(huán)境變量-->系統(tǒng)環(huán)境變量新建
如果是多個路徑,則使用英文格式的分號分隔。以下是臨時(shí)設(shè)置當(dāng)前命令行窗口的PYTHONPATH:
setPYTHONPATH='D:\pypath;d:\pypath1'
在unix下,設(shè)置PYTHONPATH環(huán)境變量的方式,使用冒號分隔多個路徑:另外,必須得export導(dǎo)出為環(huán)境變量
exportPYTHONPATH=/tmp/pypath1:/tmp/pypath2
如果要永久生效,則寫入配置文件中:
echo'exportPYTHONPATH=/tmp/pypath1:/tmp/pypath2'>/etc/profile.d/pypth.sh
chmod+x/etc/profile.d/pypth.sh
source/etc/profile.d/pypth.sh
標(biāo)準(zhǔn)庫路徑
在Linux下,標(biāo)準(zhǔn)庫的路徑一般是在/usr/lib/pythonXXX/下(XXX表示python版本號),此目錄下有些分了子目錄。
例如:
['','/usr/lib/python35.zip','/usr/lib/python3.5','/usr/lib/python3.5/plat-x86_64-linux-gnu','/usr/lib/python3.5/lib-dynload','/usr/local/lib/python3.5/dist-packages','/usr/lib/python3/dist-packages']
其中/usr/lib/python3.5和其內(nèi)的幾個子目錄都是標(biāo)準(zhǔn)庫的搜索路徑。
注意其中/usr/lib/python35.zip,它是ZIP文件組件,當(dāng)定義此文件為搜索路徑時(shí),將自動解壓縮該文件,并從此文件中搜索模塊。
Windows下根據(jù)python安裝位置的不同,標(biāo)準(zhǔn)庫的路徑不同。如果以默認(rèn)路徑方式安裝的python,則標(biāo)準(zhǔn)庫路徑為C:\\ProgramFiles(x86)\\Python36-32及其分類的子目錄。
.pth文件自定義路徑
可以將自定義的搜索路徑放進(jìn)一個.pth文件中,每行一個搜索路徑。然后將.pth文件放在python安裝目錄或某個標(biāo)準(zhǔn)庫路徑內(nèi)的sitepackages目錄下即可。
這是一種替換PYTHONPATH的友好方式,因?yàn)椴煌僮飨到y(tǒng)設(shè)置環(huán)境變量的方式不一樣,而以文件的方式記錄是所有操作系統(tǒng)都通用的。
例如,windows下,在python安裝目錄C:\\ProgramFiles(x86)\\Python36-32下新增一個mypath.pth文件,內(nèi)容如下:
d:\pypath1
d:\pypath2
再去輸出sys.path,將可以看到這兩個路徑已經(jīng)放進(jìn)了搜索列表中。
修改搜索路徑
除了上面環(huán)境變量和.pth文件,還可以直接修改sys.path或者site.getsitepackages()的結(jié)果。
例如,在import導(dǎo)入sys模塊之后,可以修改sys.path,向這個列表中添加其它搜索路徑,這樣之后導(dǎo)入其它模塊的時(shí)候,也會搜索該路徑。
例如:
importsys
sys.path.append('d:\\pypath3')
print(sys.path)
sys.path的最后一項(xiàng)將是新添加的路徑。
以上內(nèi)容為大家介紹了python模塊搜索路徑,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。