亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析Python3中的Import

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

Python import的搜索路徑

import的搜索路徑為:

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

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

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

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

內(nèi)置模塊

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

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

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

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

import A.B
或
from A import B

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

from . import B
或
from ..A import B

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

模塊的執(zhí)行方式

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

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

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

包和模塊

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

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

各種情形測試

模塊直接導(dǎo)入

即模塊所在的目錄都不是一個包結(jié)構(gòu),各個模塊都是獨立的,比如以下的目錄結(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才行,否則就會出現(xiàn)如下錯誤:

ModuleNotFoundError: No module named 'modu2'

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

包外導(dǎo)入

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

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


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

python -m pack1.modu1

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

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

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

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

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


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

from ..pack2.modu2 import hello2
hello2()


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

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

python -m Test3.pack1.modu1

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

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

python Test3\pack1\modu1.py

就會報如下錯誤:

ValueError: attempted relative import beyond top-level package

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

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

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

from .modu2 import hello2
hello2()

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

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

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

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

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

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

from Test3.pack2.modu2 import hello2
hello2()

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

python -m Test3.pack1.modu1

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

python Test3\pack1\modu1.py

那么就會報錯:

ModuleNotFoundError: No module named 'Test3'

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

set PYTHONPATH=D:\learn\import_test\

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

總結(jié)

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

相關(guān)文章

  • Python隊列RabbitMQ 使用方法實例記錄

    Python隊列RabbitMQ 使用方法實例記錄

    這篇文章主要介紹了Python隊列RabbitMQ 使用方法,結(jié)合實例形式分析了Python隊列RabbitMQ創(chuàng)建隊列發(fā)送消息與創(chuàng)建消費者消費信息相關(guān)操作技巧,需要的朋友可以參考下
    2019-08-08
  • Python+matplotlib實現(xiàn)循環(huán)作圖的方法詳解

    Python+matplotlib實現(xiàn)循環(huán)作圖的方法詳解

    這篇文章主要為大家介紹了Python如何利用matplotlib實現(xiàn)循環(huán)作圖的,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2022-06-06
  • python解決網(wǎng)站的反爬蟲策略總結(jié)

    python解決網(wǎng)站的反爬蟲策略總結(jié)

    網(wǎng)站做了很多反爬蟲工作,爬起來有些艱難,本文詳細介紹了python解決網(wǎng)站的反爬蟲策略,有需要的小伙伴可以參考下。
    2016-10-10
  • python自動查詢12306余票并發(fā)送郵箱提醒腳本

    python自動查詢12306余票并發(fā)送郵箱提醒腳本

    這篇文章主要為大家詳細介紹了Python自動查詢12306余票并發(fā)送郵箱提醒腳本,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Opencv實現(xiàn)傾斜圖片轉(zhuǎn)正示例

    Opencv實現(xiàn)傾斜圖片轉(zhuǎn)正示例

    本文主要介紹了Opencv實現(xiàn)傾斜圖片轉(zhuǎn)正示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • 淺談python的輸入輸出,注釋,基本數(shù)據(jù)類型

    淺談python的輸入輸出,注釋,基本數(shù)據(jù)類型

    這篇文章主要介紹了python的輸入輸出,注釋,基本數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Python Sqlalchemy如何實現(xiàn)select for update

    Python Sqlalchemy如何實現(xiàn)select for update

    這篇文章主要介紹了Python Sqlalchemy如何實現(xiàn)select for update,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Keras實現(xiàn)Vision?Transformer?VIT模型示例詳解

    Keras實現(xiàn)Vision?Transformer?VIT模型示例詳解

    這篇文章主要為大家介紹了Keras實現(xiàn)Vision?Transformer?VIT模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • 如何使用matplotlib讓你的數(shù)據(jù)更加生動

    如何使用matplotlib讓你的數(shù)據(jù)更加生動

    數(shù)據(jù)可視化用于以更直接的表示方式顯示數(shù)據(jù),并且更易于理解,下面這篇文章主要給大家介紹了關(guān)于如何使用matplotlib讓你的數(shù)據(jù)更加生動的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • python+opencv3.4.0 實現(xiàn)HOG+SVM行人檢測的示例代碼

    python+opencv3.4.0 實現(xiàn)HOG+SVM行人檢測的示例代碼

    這篇文章主要介紹了python+opencv3.4.0 實現(xiàn)HOG+SVM行人檢測的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論