您好,登錄后才能下訂單哦!
這篇“Python中import是如何工作的”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Python中import是如何工作的”文章吧。
模塊與包的關系,可以類比文件和目錄,模塊就是文件。
Python 文檔中這樣描述,一個 Python 文件就是一個模塊,Python 的文件名(不帶后綴.py)就是模塊名。
一個 module 可以包含變量、函數和類,它們是該 module 定義的命名空間的一部分,因此變量的命名問題不是問題,因為兩個不同的模塊可以有同名的變量、函數和類。
模塊與包的關系,可以類比文件和目錄,包就是目錄。
package 里面可以有 module,也可以有子包(sub-package)。一個模塊定義一個命名空間,以便變量、函數和類可以在兩個不同的模塊中具有相同的名稱,同樣的,一個包對其組成的包和模塊做同樣的事情,可以通過點號訪問主包中的模塊和包。
一個基本的 package 可以包含 sub-package、modules、__init__.py(Python 3.3 之后非必需)、setup.py。一個可能的 package 結構如下所示:
而 setup.py 存在于你的 package 所在的主目錄中,包含配置信息,如所需的依賴項、腳本和子包。你還可以指定有關 package 的元數據,例如 package 的名稱、作者、描述等。
setup.py 是 pip 用來安裝你的包的文件。
先舉一個簡單的例子,比如說同一個目錄有兩個文件,file1.py 和 file2.py,內容很簡單,就打印各自的文件名,不同的是 file2.py 里面 import 了 file1:
#file1.py print("This is file1.py") #file2.py print("This is file2.py") import file1
運行 file2.py 可以得到下面的結果:
? python file2.py This is file2.py This is file1.py
可以看出:
import 很直觀,用誰就 import 誰。
import 語句就是一個普通的語句,可以放在任何位置。
一個文件被 import 的時候,就會被執行,其內部的類或對象將添加到其命名空間。
我們還要知道 import 的搜索順序,只需要記住一點,那就是 import 會去 sys.path 里面搜索。
比如我在 file2.py 的末尾添加一行代碼:import sys; print(sys.path) 就可以打印 import 的搜索路徑:
可以看出 sys.path 的順序:
會先搜索執行腳本所在的路徑
標準庫
第三方庫 site-packages
關于 sys.path 需要你注意的是:
在解釋器環境下,sys.path[0] 就是解釋器啟動時所在的路徑 ''
sys.path 并不會依賴當前程序的工作路徑 - os.getcwd(),僅僅依賴第一個腳本所在的路徑:
如果一個模塊導入另一個模塊,而后者又導入另一個模塊,則第一個模塊的 sys.path 是解釋器搜索第二個導入語句的位置。
一旦模塊或包被找到,就會執行該模塊或包。如果包里面有初始化文件 __init__.py,導入的時候,會先執行 __init__.py。
然后要導入的項目就添加到了其命名空間內,我們可以通過 xx.yy 的方式來使用。
先看看什么是絕對導入,所謂絕對導入就是這樣的形式:
import aa import aa.bb from aa import bb
這樣的方式很直觀, import 會去 sys.path 查找就行了,如果遇到了 ModuleNotFoundError,思考一下為什么 sys.path 沒有我們要導入的包,或者手動把這個包的路徑插入到 sys.path 中去。
再看看什么是相對導入,所謂相對導入就是這樣的形式:
from . import aa from .aa import bb from .. import yy
也就是說相對路徑中有個 . 號,用來表明要導入的模塊或當前的包的相對位置。
舉個例子,我們 pythonimportexample 目錄下新建一個目錄 subpackage1,在 subpackage1 內新建兩個文件 file3.py、file4.py。
內容如下:
file3.py :
print("This is file3.py")
file4.py:
from . import file3 print("This is file4.py")
只要我們直接運行 file4.py,那是一定會報錯的:
Python 提示我們:
ImportError: attempted relative import with no known parent package
也就是說相對導入不知道父包是誰,換句話說,這是一個子包,必須讓父包來調用它,直接運行這個文件是不行的,即使你在 file4.py 的目錄 subpackage1 同級的目錄執行該文件也是不行的,見上圖。
但是在 file4.py 的目錄 subpackage1 同級的目錄作為一個 module 來執行是可以的,如下圖:
換句話說,我們把 subpackage1 作為一個包來讓別人用,相對導入是可以的,比如說我們在目錄 subpackage1 同級的目錄新建一個 file5.py 的文件,內容如下:
file5.py:
from subpackage1 import file4。
然后,執行 python file5.py 可以看出,相對導入已經正常工作:
結論
如果是當做腳本文件直接運行的,使用絕對導入。
如果是當做模塊供其他文件導入,使用相對導入。
先上一個圖來看下目錄及引用結構,方塊的是目錄,橢圓的是文件,曲線是引用:
其中 import_example 目錄下有 setup.py 和 run.py
run.py 導入了 file4、file5、file6。
file4 導入了 file3,file5 導入了 file3。
file6 導入了 file2,file2 導入了 file1。
現在我們來執行一下 run.py 看下效果:
可以看出所有相對導入都已正常工作,雖然 file3 被導入了兩次,但只執行了一次,說明 Python 內部已經考慮了同一個包的多重導入問題。自定義包就是讓其他文件導入使用的,因此 pythonimportexample目錄下都使用相對導入。
以上就是關于“Python中import是如何工作的”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。