91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3中的Import的作用有哪些

發布時間:2021-02-23 17:38:25 來源:億速云 閱讀:314 作者:Leah 欄目:開發技術

這篇文章給大家介紹Python3中的Import的作用有哪些,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

Python import的搜索路徑

import的搜索路徑為:

  • 搜索「內置模塊」(built-in module)

  • 搜索 sys.path 中的路徑

  • 而sys.path在初始化時,又會按照順序添加以下路徑:

foo.py 所在目錄(如果是軟鏈接,那么是真正的 foo.py 所在目錄)或當前目錄;

環境變量 PYTHONPATH中列出的目錄(類似環境變量 PATH,由用戶定義,默認為空);
site 模塊被 import 時添加的路徑1(site 會在運行時被自動 import)。

import site 所添加的路徑一般是 XXX/site-packages。如果懶得記 sys.path 的初始化過程,可以簡單的認為 import 的查找順序是:

內置模塊

.py 文件所在目錄
pip 或 easy_install 安裝的包

絕對導入和相對導入

絕對導入和相對導入的關系可以類比絕對路徑和相對路徑。

絕對導入的格式為:

import A.B
或
from A import B

相對導入格式為:

from . import B
或
from ..A import B

其中,點號.代表當前模塊,..代表上層模塊,…代表上上層模塊,依次類推。

模塊的執行方式

模塊的執行可以有兩種方式:直接執行和以模塊執行,即:

python example/foo.py
或
python -m example.foo

注意,以模塊執行時,一定要有包的概念,即example一定是個包,而foo是這個包下的模塊,這樣才能順利執行。

包和模塊

模塊: 一個 .py 文件就是一個模塊(module)

包: init .py 文件所在目錄就是包(package)

各種情形測試

模塊直接導入

即模塊所在的目錄都不是一個包結構,各個模塊都是獨立的,比如以下的目錄結構:

D:\LEARN\IMPORT_TEST\TEST1
├─pack1
│  modu1.py
└─pack2
  modu2.py

modu1.py中的內容為:

import sys
sys.path.append("D:\\learn\\import_test\\TEST1\\pack2")
from modu2 import hello2
hello2()

modu2.py中的內容為:

def hello2():
 print("hello, I am module 2")

注意在modu1中一定加上sys.path.append那部分內容,即根據上面的描述,一定要讓modu1能找到modu2才行,否則就會出現如下錯誤:

ModuleNotFoundError: No module named 'modu2'

此時進入pack1目錄下,以直接執行或模塊執行的方式都可以順利輸出。

包外導入

將上面兩個模塊所在的目錄都變為包結構,即:

D:\LEARN\IMPORT_TEST\TEST2
├─pack1
│  modu1.py
│  __init__.py
└─pack2
  modu2.py
  __init__.py

此時也能順利執行,同時比上面非包結構的多出來一條執行方式,即:

python -m pack1.modu1

即以包名+模塊名的方式執行。

上面兩種情形,即模塊與模塊、包與包都是相互獨立的關系,也就沒有相對導入的意義。

如果是在一個包內的不同模塊的導入,那么最自然的就是使用相對導入。

包內相對導入

D:\LEARN\IMPORT_TEST\Test3
│ __init__.py
│
├─pack1
│  modu1.py
│  __init__.py
│
└─pack2
  modu2.py
  __init__.py

此時modu1.py中的內容為:

from ..pack2.modu2 import hello2
hello2()

即將sys.path.append去掉,因為是在一個包內相互引用,此時這樣寫沒有意義。

此時正確運行的方式是進入Test3上一層的文件夾,然后:

python -m Test3.pack1.modu1

即明確地告訴解釋器模塊的層次結構。

而如果采用直接運行的方式,比如:

python Test3\pack1\modu1.py

就會報如下錯誤:

ValueError: attempted relative import beyond top-level package

這是因為,相對導入使用模塊的 name (這里的name和下面的main都是有兩個下劃線的,但是網頁顯示不出來。。)屬性來決定模塊在包結構中的位置。當 name 屬性不包含包信息(i.e. 沒有用'.'表示的層次結構,比如' main ‘),則相對導入將模塊解析為頂層模塊,而不管模塊在文件系統中的實際位置。這里模塊被直接運行,則它自己為頂層模塊,不存在層次結構,所以找不到其他的相對路徑。

因此,直接運行帶有相對導入的模塊是不行的,需要通過模塊運行的方式,將包結構明確告訴它才行。

這個原理也適用于下面這種錯誤,比如將modu2移動到pack1中,即與modu1在同一個目錄下,然后將modu1的內容改為這樣的相對引用:

from .modu2 import hello2
hello2()

此時使用模塊執行的方式沒有問題,如果還是想嘗試直接運行,那么就會出現:

ModuleNotFoundError: No module named '__main__.modu2'; '__main__' is not a package

原因就是此時沒有包結構, main 也不是個包。

那么解決方法就是或者使用模塊運行的方式運行,或者將它改成下面的絕對導入的方式就可以直接運行。

包內絕對導入

那么,如果將modu1.py中的內容改為絕對導入,即:

from Test3.pack2.modu2 import hello2
hello2()

此時正確運行方式也是進入Test3上一層文件夾,然后使用模塊執行的方式運行:

python -m Test3.pack1.modu1

如果此時采用直接運行的方式:

python Test3\pack1\modu1.py

那么就會報錯:

ModuleNotFoundError: No module named 'Test3'

這主要是因為Test3沒有被找到,即按照第一部分所說,Test3沒有在import的搜索路徑中。所以,只要將它加入進去即可,比如:

set PYTHONPATH=D:\learn\import_test\

此時再直接運行就沒有問題了。

關于Python3中的Import的作用有哪些就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

惠东县| 陆河县| 侯马市| 渭南市| 聂荣县| 丹巴县| 杭州市| 东光县| 咸丰县| 三江| 宜黄县| 搜索| 盘山县| 博客| 陆河县| 萨迦县| 蛟河市| 濮阳县| 疏勒县| 依安县| 凤台县| 丹江口市| 鹤峰县| 方山县| 太谷县| 肇东市| 双江| 平安县| 柳州市| 饶河县| 北川| 台江县| 若尔盖县| 和平县| 法库县| 陇川县| 兴隆县| 苍山县| 阿克| 阿拉善右旗| 凤台县|