簡體   English   中英

常規和命名空間包的 sys.path 的導入順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM