最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解析Python3中的Import

 更新時(shí)間:2019年10月13日 16:06:43   作者:programming  
本文通過(guò)示例代碼帶領(lǐng)大家一起學(xué)習(xí)Python3中的Import知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

Python import的搜索路徑

import的搜索路徑為:

  • 搜索「內(nèi)置模塊」(built-in module)
  • 搜索 sys.path 中的路徑
  • 而sys.path在初始化時(shí),又會(huì)按照順序添加以下路徑:

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

環(huán)境變量 PYTHONPATH中列出的目錄(類(lèi)似環(huán)境變量 PATH,由用戶定義,默認(rèn)為空);
site 模塊被 import 時(shí)添加的路徑1(site 會(huì)在運(yùn)行時(shí)被自動(dòng) import)。

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

內(nèi)置模塊

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

絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入

絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入的關(guān)系可以類(lèi)比絕對(duì)路徑和相對(duì)路徑。

絕對(duì)導(dǎo)入的格式為:

import A.B
或
from A import B

相對(duì)導(dǎo)入格式為:

from . import B
或
from ..A import B

其中,點(diǎn)號(hào).代表當(dāng)前模塊,..代表上層模塊,…代表上上層模塊,依次類(lèi)推。

模塊的執(zhí)行方式

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

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

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

包和模塊

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

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

各種情形測(cè)試

模塊直接導(dǎo)入

即模塊所在的目錄都不是一個(gè)包結(jié)構(gòu),各個(gè)模塊都是獨(dú)立的,比如以下的目錄結(jié)構(gòu):

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


modu1.py中的內(nèi)容為:

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


modu2.py中的內(nèi)容為:

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


注意在modu1中一定加上sys.path.append那部分內(nèi)容,即根據(jù)上面的描述,一定要讓modu1能找到modu2才行,否則就會(huì)出現(xiàn)如下錯(cuò)誤:

ModuleNotFoundError: No module named 'modu2'

此時(shí)進(jìn)入pack1目錄下,以直接執(zhí)行或模塊執(zhí)行的方式都可以順利輸出。

包外導(dǎo)入

將上面兩個(gè)模塊所在的目錄都變?yōu)榘Y(jié)構(gòu),即:

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


此時(shí)也能順利執(zhí)行,同時(shí)比上面非包結(jié)構(gòu)的多出來(lái)一條執(zhí)行方式,即:

python -m pack1.modu1

即以包名+模塊名的方式執(zhí)行。

上面兩種情形,即模塊與模塊、包與包都是相互獨(dú)立的關(guān)系,也就沒(méi)有相對(duì)導(dǎo)入的意義。

如果是在一個(gè)包內(nèi)的不同模塊的導(dǎo)入,那么最自然的就是使用相對(duì)導(dǎo)入。

包內(nèi)相對(duì)導(dǎo)入

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


此時(shí)modu1.py中的內(nèi)容為:

from ..pack2.modu2 import hello2
hello2()


即將sys.path.append去掉,因?yàn)槭窃谝粋€(gè)包內(nèi)相互引用,此時(shí)這樣寫(xiě)沒(méi)有意義。

此時(shí)正確運(yùn)行的方式是進(jìn)入Test3上一層的文件夾,然后:

python -m Test3.pack1.modu1

即明確地告訴解釋器模塊的層次結(jié)構(gòu)。

而如果采用直接運(yùn)行的方式,比如:

python Test3\pack1\modu1.py

就會(huì)報(bào)如下錯(cuò)誤:

ValueError: attempted relative import beyond top-level package

這是因?yàn)椋鄬?duì)導(dǎo)入使用模塊的 name (這里的name和下面的main都是有兩個(gè)下劃線的,但是網(wǎng)頁(yè)顯示不出來(lái)。。)屬性來(lái)決定模塊在包結(jié)構(gòu)中的位置。當(dāng) name 屬性不包含包信息(i.e. 沒(méi)有用'.'表示的層次結(jié)構(gòu),比如' main ‘),則相對(duì)導(dǎo)入將模塊解析為頂層模塊,而不管模塊在文件系統(tǒng)中的實(shí)際位置。這里模塊被直接運(yùn)行,則它自己為頂層模塊,不存在層次結(jié)構(gòu),所以找不到其他的相對(duì)路徑。

因此,直接運(yùn)行帶有相對(duì)導(dǎo)入的模塊是不行的,需要通過(guò)模塊運(yùn)行的方式,將包結(jié)構(gòu)明確告訴它才行。

這個(gè)原理也適用于下面這種錯(cuò)誤,比如將modu2移動(dòng)到pack1中,即與modu1在同一個(gè)目錄下,然后將modu1的內(nèi)容改為這樣的相對(duì)引用:

from .modu2 import hello2
hello2()

此時(shí)使用模塊執(zhí)行的方式?jīng)]有問(wèn)題,如果還是想嘗試直接運(yùn)行,那么就會(huì)出現(xiàn):

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

原因就是此時(shí)沒(méi)有包結(jié)構(gòu), main 也不是個(gè)包。

那么解決方法就是或者使用模塊運(yùn)行的方式運(yùn)行,或者將它改成下面的絕對(duì)導(dǎo)入的方式就可以直接運(yùn)行。

包內(nèi)絕對(duì)導(dǎo)入

那么,如果將modu1.py中的內(nèi)容改為絕對(duì)導(dǎo)入,即:

from Test3.pack2.modu2 import hello2
hello2()

此時(shí)正確運(yùn)行方式也是進(jìn)入Test3上一層文件夾,然后使用模塊執(zhí)行的方式運(yùn)行:

python -m Test3.pack1.modu1

如果此時(shí)采用直接運(yùn)行的方式:

python Test3\pack1\modu1.py

那么就會(huì)報(bào)錯(cuò):

ModuleNotFoundError: No module named 'Test3'

這主要是因?yàn)門(mén)est3沒(méi)有被找到,即按照第一部分所說(shuō),Test3沒(méi)有在import的搜索路徑中。所以,只要將它加入進(jìn)去即可,比如:

set PYTHONPATH=D:\learn\import_test\

此時(shí)再直接運(yùn)行就沒(méi)有問(wèn)題了。

總結(jié)

以上所述是小編給大家介紹的Python3中的Import理解,希望對(duì)大家有所幫助!

相關(guān)文章

  • Python中讀取和加解密PDF文件的詳細(xì)教程

    Python中讀取和加解密PDF文件的詳細(xì)教程

    在Python中讀取和加密PDF文件是一項(xiàng)常見(jiàn)且實(shí)用的任務(wù),尤其對(duì)于需要處理大量文檔自動(dòng)化處理的場(chǎng)景,本文將詳細(xì)介紹如何使用Python讀取PDF文件內(nèi)容以及如何使用不同的庫(kù)來(lái)給PDF文件加密,需要的朋友可以參考下
    2024-08-08
  • Pytorch參數(shù)注冊(cè)和nn.ModuleList nn.ModuleDict的問(wèn)題

    Pytorch參數(shù)注冊(cè)和nn.ModuleList nn.ModuleDict的問(wèn)題

    這篇文章主要介紹了Pytorch參數(shù)注冊(cè)和nn.ModuleList nn.ModuleDict的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • python調(diào)用百度地圖WEB服務(wù)API獲取地點(diǎn)對(duì)應(yīng)坐標(biāo)值

    python調(diào)用百度地圖WEB服務(wù)API獲取地點(diǎn)對(duì)應(yīng)坐標(biāo)值

    這篇文章主要為大家詳細(xì)介紹了python調(diào)用百度地圖WEB服務(wù)API獲取地點(diǎn)對(duì)應(yīng)坐標(biāo)值,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • numpy存取數(shù)據(jù)(tofile/fromfile)的實(shí)現(xiàn)

    numpy存取數(shù)據(jù)(tofile/fromfile)的實(shí)現(xiàn)

    本文主要介紹了numpy存取數(shù)據(jù)(tofile/fromfile)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • python常用函數(shù)詳解

    python常用函數(shù)詳解

    本文給大家總結(jié)了python中常用函數(shù),非常的細(xì)致全面,有需要的小伙伴可以參考下
    2016-09-09
  • 詳解Python中的字符串格式化

    詳解Python中的字符串格式化

    這篇文章主要為大家介紹了Python中的字符串格式化,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • Python制作動(dòng)態(tài)詞頻條形圖的全過(guò)程

    Python制作動(dòng)態(tài)詞頻條形圖的全過(guò)程

    說(shuō)起動(dòng)態(tài)圖表,最火的莫過(guò)于動(dòng)態(tài)條形圖了,下面這篇文章主要給大家介紹了關(guān)于Python制作動(dòng)態(tài)詞頻條形圖的全過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2021-11-11
  • Python?LeNet網(wǎng)絡(luò)詳解及pytorch實(shí)現(xiàn)

    Python?LeNet網(wǎng)絡(luò)詳解及pytorch實(shí)現(xiàn)

    LeNet主要用來(lái)進(jìn)行手寫(xiě)字符的識(shí)別與分類(lèi),并在美國(guó)的銀行中投入了使用。本文主要為大家詳細(xì)介紹了LetNet以及通過(guò)pytorch實(shí)現(xiàn)LetNet,感興趣的小伙伴可以學(xué)習(xí)一下
    2021-11-11
  • Python實(shí)現(xiàn)不寫(xiě)硬盤(pán)上傳文件

    Python實(shí)現(xiàn)不寫(xiě)硬盤(pán)上傳文件

    這篇文章主要為大家介紹了Python實(shí)現(xiàn)不寫(xiě)硬盤(pán)上傳文件的方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • python 類(lèi)詳解及簡(jiǎn)單實(shí)例

    python 類(lèi)詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了python 類(lèi)詳解及實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2017-03-03

最新評(píng)論

日喀则市| 门头沟区| 宿松县| 东莞市| 白朗县| 贞丰县| 谷城县| 宣武区| 广南县| 安化县| 弋阳县| 闽清县| 洛隆县| 六安市| 巴楚县| 通辽市| 阿拉善左旗| 岱山县| 舟曲县| 安庆市| 民乐县| 榆树市| 勃利县| 平陆县| 岢岚县| 鹤岗市| 仁化县| 临邑县| 宝兴县| 安塞县| 鄯善县| 涿州市| 莎车县| 中山市| 明溪县| 南涧| 尖扎县| 县级市| 普安县| 凤阳县| 明水县|