[英]import order for sys.path for regular and namespace packages
正如官方文檔所說( 模塊搜索路徑):
當導入名為 spam 的模塊時,解釋器首先搜索具有該名稱的內置模塊。 如果沒有找到,它會在變量 sys.path 給出的目錄列表中搜索名為 spam.py 的文件。
它將在sys.path
中從第一個到最后一個搜索 package 。
但我遇到一個例子不符合這一點。
這是一個例子:
當我安裝 flask 時:
>>> import flask
>>> flask.__path__
['/home/yixuan/.local/lib/python3.6/site-packages/flask']
如果我在我的自定義目錄(即 /home/yixuan/temp)下創建一個目錄flask
,那么我運行這個:
>>> import sys
>>> sys.path
['', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/yixuan/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
>>> sys.path.insert(0, '/home/yixuan/temp')
>>> sys.path
['/home/yixuan/temp', '', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/yixuan/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages']
>>> import flask
>>> flask.__path__
['/home/yixuan/.local/lib/python3.6/site-packages/flask']
(這是兩個單獨的口譯會話!)
而且我不知道為什么 flask package 不是我的自定義 flask 目錄。 在sys.path
中, /home/yixuan/.local/lib/python3.6/site-packages
放在/home/yixuan/temp
之后,根據我的理解,這不正常,不是嗎? 如果是這樣,什么原因會導致這種情況發生?
沒有__init__.py
( flask/
) 文件的目錄是命名空間 package,而不是常規的 package ( flask/__init__.py
) 或模塊 ( flask.py
)。 雖然命名空間包按sys.path
的順序記錄,但僅在根本找不到常規 package 或模塊時才使用它們。
PEP 420 -- 隱式命名空間包
...
規格
...
在為父路徑中的每個目錄尋找名為“foo”的模塊或 package 時:
- 如果找到
<directory>/foo/__init__.py
,則導入並返回常規 package。- 如果沒有,但找到
<directory>/foo.{py,pyc,so,pyd}
,則導入並返回一個模塊。 擴展的確切列表因平台以及是否指定-> O
標志而異。 這里的列表具有代表性。- 如果沒有,但
<directory>/foo
找到並且是一個目錄,則記錄它並繼續掃描父路徑中的下一個目錄。- 否則,掃描將繼續父路徑中的下一個目錄。
如果掃描完成但沒有返回模塊或 package,並且至少記錄了一個目錄,則創建命名空間 package。
...
請參閱有關導入的sys.path 文檔。 Flask 現在是 python 3 安裝的一部分。
當導入名為 spam 的模塊時,解釋器首先搜索具有該名稱的內置模塊。 如果沒有找到,它會在變量 sys.path 給出的目錄列表中搜索名為 spam.py 的文件。 sys.path 從這些位置初始化。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.