目錄
一、子產品搜尋路徑的順序
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的第一個值是目前執行檔案的所在的檔案夾
如果我們在運作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>
假設我們有上述的目錄結構的檔案,檔案内代碼分别是:
<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。