天天看點

086 子產品的搜尋路徑

目錄

一、子產品搜尋路徑的順序

1.1 驗證先從記憶體中找

1.2 驗證先從内置中找

1.3 驗證從sys.path中找

二、搜尋路徑以執行檔案為準

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

子產品的搜尋路徑指的就是在導入子產品時需要檢索的檔案夾。

導入子產品時查找子產品的順序是:

先從記憶體中已經導入的子產品中尋找

内置的子產品

環境變量sys.path中找

<code>''' ['/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'] '''</code>

強調:sys.path的第一個值是目前執行檔案的所在的檔案夾

086 子產品的搜尋路徑

如果我們在運作run.py檔案的時候,快速删除mmm.py檔案,我們會發現檔案會繼續運作,而不會報錯,因為mmm已經被導入記憶體當中。如果我們再一次運作run.py時會報錯,因為mmm.py已經被删除了。

<code>def f1(): print('from mmm.py f1')</code>

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

<code>import mmm mmm.f1()</code>

086 子產品的搜尋路徑
086 子產品的搜尋路徑

假設我們有上述的目錄結構的檔案,檔案内代碼分别是:

<code>import sys print('子產品m1中檢視的結果',sys.path) # import m2 from dir1 import m2 m2.f2()</code>

其中run.py檔案的執行路徑是<code>/Users/mac/Desktop/video/python/day16/子產品搜尋路徑練習</code>,如果我們在m1.py中直接使用<code>import m2</code>導入m2會報錯,而使用<code>from dir1 import m2</code>導入m2則會成功,因為搜尋路徑以執行檔案為準,dir1和run.py是同目錄下的,是以run.py的環境變量能找到dir1;而m2和run.py不是同目錄下的,是以run.py的環境變量無法直接找到m2。

086 子產品的搜尋路徑