模塊的搜索路徑


一、模塊搜索路徑的順序

模塊其實就是一個文件,如果要執行文件,首先就需要找到模塊的路徑(某個文件夾)。如果模塊的文件路徑和執行文件不在同一個文件目錄下,我們就需要指定模塊的路徑。

模塊的搜索路徑指的就是在導入模塊時需要檢索的文件夾。

導入模塊時查找模塊的順序是:

  1. 先從內存中已經導入的模塊中尋找
  2. 內置的模塊
  3. 環境變量sys.path中找
import sys
print(f"sys.path: {sys.path}")

'''
['/Users/mac/Desktop/video/python/day16', 
'/Users/mac/Desktop/video/python', 
'/Applications/anaconda3/lib/python36.zip', 
'/Applications/anaconda3/lib/python3.6', 
'/Applications/anaconda3/lib/python3.6/lib-dynload', 
'/Applications/anaconda3/lib/python3.6/site-packages', 
'/Applications/PyCharm.app/Contents/helpers/pycharm_matplotlib_backend']
'''

強調:sys.path的第一個值是當前執行文件的所在的文件夾

61模塊搜索路徑-搬磚.jpg?x-oss-process=style/watermark

1.1 驗證先從內存中找

如果我們在運行run.py文件的時候,快速刪除mmm.py文件,我們會發現文件會繼續運行,而不會報錯,因為mmm已經被導入內存當中。如果我們再一次運行run.py時會報錯,因為mmm.py已經被刪除了。

# mmm.py

def f1():
    print('from mmm.py f1')
# run.py
import time
import mmm

time.sleep(10)
import mmm
mmm.f1()  # from mmm.py f1

1.2 驗證先從內置中找

# time.py
print('from time.py')
# run.py
import time
print(time)  # <module 'time' (built-in)>

1.3 驗證從sys.path中找

如果mmm.py在/Users/mac/Desktop/video/python路徑下,而執行文件路徑為/Users/mac/Desktop/video/python/day16,如果普通導入一定會報錯,我們可以把/Users/mac/Desktop/video/python添加到環境變量sys.path中,防止報錯。

# run.py
import sys
sys.path.append(r'/Users/mac/Desktop/video/python')
print(sys.path)

import mmm
mmm.f1()

二、搜索路徑以執行文件為准

61模塊的搜索路徑-撤回.jpg?x-oss-process=style/watermark

61模塊的搜索路徑-練習.jpg?x-oss-process=style/watermark

假設我們有上述的目錄結構的文件,文件內代碼分別是:

# m1.py

import sys
print('模塊m1中查看的結果',sys.path)
# import m2
from dir1 import m2
m2.f2()
# m2.py

import sys
print(sys.path)

def f2():
    print('from f2')
# run.py
import sys
print('執行文件查看的結果:',sys.path)
from dir1 import m1

其中run.py文件的執行路徑是/Users/mac/Desktop/video/python/day16/模塊搜索路徑練習,如果我們在m1.py中直接使用import m2導入m2會報錯,而使用from dir1 import m2導入m2則會成功,因為搜索路徑以執行文件為准,dir1和run.py是同目錄下的,因此run.py的環境變量能找到dir1;而m2和run.py不是同目錄下的,因此run.py的環境變量無法直接找到m2。

61模塊的搜索路徑-撤回1.jpg?x-oss-process=style/watermark


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM