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

python中相對(duì)路徑導(dǎo)入的正確用法及錯(cuò)誤避免方法

 更新時(shí)間:2025年12月17日 09:13:19   作者:脊柱蛀蟲  
這篇文章主要為大家詳細(xì)介紹了python中相對(duì)路徑導(dǎo)入的正確用法及報(bào)錯(cuò)ImportError: attempted relative import with no known parent package的相關(guān)解決方法,有需要的小伙伴可以了解下

前言

相對(duì)導(dǎo)入只適合包內(nèi)模塊去使用!??!

一個(gè) .py 文件一旦使用相對(duì)導(dǎo)入,則直接運(yùn)行該文件一定會(huì)報(bào)錯(cuò):“ImportError: attempted relative import with no known parent package”。

正確的使用方法是:

包內(nèi)的模塊之間使用相對(duì)導(dǎo)入,包外的模塊通過(guò)絕對(duì)路徑導(dǎo)入去調(diào)用這個(gè)包中的模塊。

【包內(nèi)相對(duì)導(dǎo)入,包外絕對(duì)導(dǎo)入】

示例:

假設(shè)現(xiàn)有如下文件結(jié)構(gòu),main.py 與 package 在同一級(jí)目錄。package 是一個(gè)文件夾(包),其中包含了模塊 module1.py 和 module2.py 以及包的初始化文件__init__.py。即,main.py在包外,module1.py在包內(nèi)。

main.py
package/
├── __init__.py
├── module1.py
└── module2.py

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

現(xiàn)在假設(shè) package 內(nèi)的模塊 module1 相對(duì)導(dǎo)入了同級(jí)目錄的模塊 module2 的函數(shù) func2 。

module1.py :

# module1.py
from .module2 import func2

包外間接調(diào)用:

main.py :

# main.py
from package.module1 import func2
func2()

module2.py: 

# module2.py
def func2():
    print("func2")

則運(yùn)行 main.py 的輸出結(jié)果是:

func2 

如果你不知道什么是文件夾和包的區(qū)別,不知道什么是相對(duì)導(dǎo)入和絕對(duì)導(dǎo)入,以下是一些補(bǔ)充信息。

1. 基礎(chǔ)概念辨析:模塊、包、文件夾的區(qū)別

  • 文件夾/目錄(Folder/Directory):一個(gè)操作系統(tǒng)級(jí)別的概念,用于存儲(chǔ)文件和子文件夾。
  • 腳本(Script):?jiǎn)蝹€(gè) .py 文件,可以包含函數(shù)、類等定義,但主要目的是執(zhí)行一些操作。
  • 模塊(Module):?jiǎn)蝹€(gè) .py 文件,可以包含函數(shù)、類、變量等定義,用于實(shí)現(xiàn)特定的功能。主要用于代碼復(fù)用和組織,可以被其他腳本或模塊導(dǎo)入使用。
  • 程序(Program):一個(gè)或多個(gè)腳本或模塊組成的一個(gè)整體,用于完成一個(gè)完整的任務(wù)或功能。程序可以是一個(gè)簡(jiǎn)單的腳本,也可以是一個(gè)復(fù)雜的項(xiàng)目。通常會(huì)通過(guò)主程序 main.py 啟動(dòng),主程序負(fù)責(zé)協(xié)調(diào)各個(gè)模塊的運(yùn)行。
  • 包(Package):一個(gè)文件夾/目錄,但是目錄必須中包含一個(gè)特殊的文件 __init__.py。包可以包含子包,形成層次結(jié)構(gòu)。
  • 庫(kù)(Library):一組模塊或包的集合,通常用于實(shí)現(xiàn)特定的功能或功能集。庫(kù)可以是標(biāo)準(zhǔn)庫(kù)(Python 自帶的庫(kù)),也可以是第三方庫(kù)(通過(guò) pip 安裝的庫(kù))。通常通過(guò) import 語(yǔ)句導(dǎo)入使用。第三方庫(kù)可以通過(guò) pip 安裝和管理。標(biāo)準(zhǔn)庫(kù)有 mathos、sys 等。第三方庫(kù)有 requests、numpy、pandas 等。
  • 項(xiàng)目(Project):一個(gè)包含多個(gè)文件和目錄的完整開發(fā)任務(wù),用于實(shí)現(xiàn)一個(gè)完整應(yīng)用程序。

2. 絕對(duì)路徑和相對(duì)路徑(Absolute & Relative)

2.1 使用方法

假設(shè)有一個(gè)包結(jié)構(gòu)如下:

package/
├── __init__.py
├── module1.py
└── subpackage/
    ├── __init__.py
    └── module2.py

module1中絕對(duì)導(dǎo)入 module2

# module1.py
from package.subpackage import module2

module2.func2()

module2 中絕對(duì)導(dǎo)入 module1

# module2.py
from package import module1

module1.func1()

module1中相對(duì)導(dǎo)入 module2

# module1.py
from .subpackage import module2

module2.func2()

module2中相對(duì)導(dǎo)入 module1

# module2.py
from .. import module1

module1.func1()

2.2 使用場(chǎng)景

絕對(duì)導(dǎo)入的使用場(chǎng)景

  • 跨包導(dǎo)入:當(dāng)需要從一個(gè)包導(dǎo)入另一個(gè)包中的模塊時(shí),絕對(duì)導(dǎo)入是更好的選擇。
  • 清晰的路徑:當(dāng)模塊結(jié)構(gòu)復(fù)雜時(shí),絕對(duì)路徑更清晰,便于理解和維護(hù)。
  • 避免沖突:在大型項(xiàng)目中,絕對(duì)路徑可以避免不同模塊之間的路徑?jīng)_突。

相對(duì)導(dǎo)入的使用場(chǎng)景

  • 包內(nèi)部模塊導(dǎo)入:在包內(nèi)部的模塊之間導(dǎo)入時(shí),相對(duì)導(dǎo)入可以使代碼更簡(jiǎn)潔。
  • 包的位置可能變化:如果包的位置發(fā)生變化,相對(duì)導(dǎo)入可以減少路徑調(diào)整的工作量。

2.3 注意事項(xiàng)

相對(duì)導(dǎo)入的限制

  • 不能在腳本中使用:如果直接運(yùn)行腳本(如 python script.py),相對(duì)導(dǎo)入會(huì)報(bào)錯(cuò)。
  • 僅適用于包內(nèi)部:相對(duì)導(dǎo)入只能在包內(nèi)部的模塊之間使用,不能在包外部使用。

絕對(duì)導(dǎo)入的優(yōu)點(diǎn)

  • 路徑明確:絕對(duì)路徑更清晰,便于理解和維護(hù)。
  • 避免沖突:在大型項(xiàng)目中,絕對(duì)路徑可以避免不同模塊之間的路徑?jīng)_突。
  • 適用范圍廣:適用于導(dǎo)入項(xiàng)目中的任何模塊,無(wú)論當(dāng)前模塊的位置如何。

總是實(shí)在不行就用絕對(duì)導(dǎo)入,只要你的文件位置不會(huì)變來(lái)變?nèi)?,包不出錯(cuò)的。

3. 基礎(chǔ)的 import 語(yǔ)法

3.1 導(dǎo)入方法1:導(dǎo)入整個(gè)模塊

先導(dǎo)入整個(gè)模塊,再通過(guò)模塊名訪問(wèn)指定對(duì)象。 模塊中的所有對(duì)象(函數(shù)、類、變量等)都可以通過(guò) 模塊名.對(duì)象名 的方式訪問(wèn)。例如:

import 模塊名
模塊名.函數(shù)名()

優(yōu)點(diǎn):可以清楚地知道對(duì)象來(lái)自哪個(gè)模塊 & 不會(huì)污染當(dāng)前命名空間。

缺點(diǎn): 前綴冗長(zhǎng)。

3.2 導(dǎo)入方法2:導(dǎo)入模塊中的所有對(duì)象

一口氣導(dǎo)入模塊中的所有對(duì)象(函數(shù)、類、變量等),模塊中的所有對(duì)象都可以使用原本的名字直接調(diào)用:

from 模塊名 import *
函數(shù)名()

優(yōu)點(diǎn):調(diào)用簡(jiǎn)潔。

缺點(diǎn):不清楚哪些對(duì)象被導(dǎo)入了 & 可能命名沖突。

3.3 導(dǎo)入方法3:導(dǎo)入模塊中的指定對(duì)象

將指定的對(duì)象導(dǎo)入到當(dāng)前命名空間中,可以直接使用對(duì)象名調(diào)用,而不需要加上模塊名作為前綴。 

from 模塊名 import 函數(shù)名, 對(duì)象2, ...
函數(shù)名()

優(yōu)點(diǎn):調(diào)用簡(jiǎn)潔。

缺點(diǎn)是:可能命名沖突。

3.4 導(dǎo)入方法4:別名導(dǎo)入

為模塊設(shè)置一個(gè)別名,使用別名來(lái)訪問(wèn)模塊中的對(duì)象。

為導(dǎo)入的對(duì)象設(shè)置別名,下面以函數(shù)對(duì)象為例。

import 模塊名 as 模塊別名
from 模塊名 import 函數(shù)名 as 函數(shù)別名
模塊別名.函數(shù)名()
函數(shù)別名()

這種方法主要用于解決名字過(guò)長(zhǎng)和命名沖突問(wèn)題。

4. 包的導(dǎo)入

4.1 導(dǎo)入包中的模塊(當(dāng)前文件與包在同一級(jí)目錄)

如果模塊位于一個(gè)包中,可以使用點(diǎn)號(hào)(.)來(lái)指定路徑。

示例: 假設(shè)當(dāng)前文件結(jié)構(gòu)如下:

main.py

package/
├── __init__.py
├── module1.py
└── subpackage/
    ├── __init__.py
    └── module2.py

( __init__.py 文件不可以缺省??!不然你之后運(yùn)行 main.py 會(huì)報(bào)錯(cuò),例如:AttributeError: module 'package' has no attribute 'module1' )

隨后,在 main.py 中,可以這樣導(dǎo)入模塊并使用(假設(shè)你在 module1 和 module2 中分別實(shí)現(xiàn)了函數(shù) func1 和 func2 ):

# main.py
import package.module1
import package.subpackage.module2

package.module1.func1()
package.subpackage.module2.func2()

這樣很麻煩對(duì)不對(duì)?前綴死長(zhǎng)死長(zhǎng)的。 

4.2 導(dǎo)入包中的對(duì)象

可以使用絕對(duì)路徑直接導(dǎo)入包中的對(duì)象:

# main.py
from package.module1 import func1
from package.subpackage.module2 import func2
func1()
func2()

但是這樣導(dǎo)入,如果包的層次很多怎么辦,那導(dǎo)入語(yǔ)句就會(huì)很長(zhǎng)?所以接下來(lái)講講 __init__.py 怎么用,這才是包的作用!【本質(zhì)其實(shí)有點(diǎn)像是超鏈接】搞完后面的操作你就可以像下面這樣導(dǎo)入并調(diào)用包里的函數(shù)了:

# main.py
from package import func1, func2
func1()
func2()

只需要在兩個(gè) __init__.py 文件中分別增加以下內(nèi)容就可以了!

# package/__init__.py
from .module1 import func1
# package/subpackage/__init__.py
from .module2 import func2

如果你直接執(zhí)行這些__init__.py文件,則會(huì)報(bào)錯(cuò):ImportError: attempted relative import with no known parent package  這是正常的。

4.3 相對(duì)導(dǎo)入(僅適用于包內(nèi)導(dǎo)入)

在包內(nèi)部的模塊之間可以使用相對(duì)導(dǎo)入。

示例:module1.py 中導(dǎo)入 subpackage/module2.py 中的 func2

from .subpackage.module2 import func2
  • . 表示當(dāng)前包。
  • .. 表示上一級(jí)包。

注意:

  • 相對(duì)導(dǎo)入只能在包內(nèi)部使用,不能在包外部使用。
  • 直接運(yùn)行使用相對(duì)導(dǎo)入的 .py 文件(腳本)會(huì)報(bào)錯(cuò)?。。?!

5. 其它一些你可能需要的信息

5.1 命名沖突

如果導(dǎo)入的對(duì)象與當(dāng)前命名空間中的對(duì)象同名,會(huì)導(dǎo)致沖突??梢酝ㄟ^(guò)別名解決。

示例:

from math import sqrt
from mymodule import sqrt as my_sqrt

print(sqrt(16))    # 使用 math 模塊中的 sqrt
print(my_sqrt(16)) # 使用 mymodule 模塊中的 sqrt

5.2 模塊查找路徑

使用 import 語(yǔ)句導(dǎo)入模塊時(shí),python如何識(shí)別導(dǎo)入的模塊時(shí)哪一個(gè)?

Python 會(huì)按照以下順序查找模塊:

  • 當(dāng)前工作目錄(os.getcwd())。
  • PYTHONPATH 環(huán)境變量。
  • 安裝的 Python 包和模塊(標(biāo)準(zhǔn)庫(kù)和第三方庫(kù))。

如果模塊不在這些路徑中,可以通過(guò)以下方式解決:

將模塊目錄添加到 sys.path

import sys
sys.path.append('/path/to/module/directory')

修改 PYTHONPATH 環(huán)境變量。

5.3 循環(huán)依賴

如果兩個(gè)模塊相互導(dǎo)入對(duì)方,可能會(huì)導(dǎo)致循環(huán)依賴問(wèn)題。盡量避免這種情況,或者通過(guò)調(diào)整模塊結(jié)構(gòu)來(lái)解決。

ps:我之前沒(méi)搞明白包和模塊啊這些東西的概念,亂用一通,導(dǎo)致項(xiàng)目老是報(bào)錯(cuò),特別是亂七八糟的導(dǎo)入引用,VSCode打開的文件夾層級(jí)變一下也會(huì)導(dǎo)致原本正常的程序報(bào)錯(cuò)。。。一開始我直接在瀏覽器搜,看了幾篇文章感覺(jué)講得亂七八糟的看不懂,最后還是求助KIMI老師,然后自己實(shí)踐了一遍,終于是大概明白之前為啥老是報(bào)錯(cuò)了(就文中提到的ImportError: attempted relative import with no known parent packageAttributeError: module 'package' has no attribute 'module1' )。

到此這篇關(guān)于python中相對(duì)路徑導(dǎo)入的正確用法及錯(cuò)誤避免方法的文章就介紹到這了,更多相關(guān)python相對(duì)路徑導(dǎo)入內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python日期格式和字符串格式相互轉(zhuǎn)換的方法

    Python日期格式和字符串格式相互轉(zhuǎn)換的方法

    這篇文章主要介紹了Python日期格式和字符串格式相互轉(zhuǎn)換的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 使用Python輕松實(shí)現(xiàn)繪制詞云圖項(xiàng)目(附詳細(xì)源碼)

    使用Python輕松實(shí)現(xiàn)繪制詞云圖項(xiàng)目(附詳細(xì)源碼)

    相信熟悉"詞云圖"的朋友都知道,"詞云圖"是用來(lái)做詞頻分析的可視化圖形,下面這篇文章主要給大家介紹了關(guān)于如何使用Python輕松實(shí)現(xiàn)繪制詞云圖項(xiàng)目的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • Python進(jìn)行數(shù)組的排序、倒序、截取方式

    Python進(jìn)行數(shù)組的排序、倒序、截取方式

    這篇文章主要介紹了Python進(jìn)行數(shù)組的排序、倒序、截取方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • keras 使用Lambda 快速新建層 添加多個(gè)參數(shù)操作

    keras 使用Lambda 快速新建層 添加多個(gè)參數(shù)操作

    這篇文章主要介紹了keras 使用Lambda 快速新建層 添加多個(gè)參數(shù)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-06-06
  • Python實(shí)現(xiàn)讀取mat、tif和hdr格式數(shù)據(jù)

    Python實(shí)現(xiàn)讀取mat、tif和hdr格式數(shù)據(jù)

    遙感影像數(shù)據(jù)大多以tif格式或者以hdr格式進(jìn)行存儲(chǔ),如果以mat格式進(jìn)行存儲(chǔ),不會(huì)保留坐標(biāo)信息,本文將詳細(xì)介紹如何使用python來(lái)讀取這三種格式的數(shù)據(jù),需要的可以參考下
    2023-12-12
  • pycharm 實(shí)現(xiàn)調(diào)試窗口恢復(fù)

    pycharm 實(shí)現(xiàn)調(diào)試窗口恢復(fù)

    這篇文章主要介紹了pycharm 實(shí)現(xiàn)調(diào)試窗口恢復(fù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Python?list?append方法之給列表追加元素

    Python?list?append方法之給列表追加元素

    這篇文章主要介紹了Python?list?append方法如何給列表追加元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 一文讀懂Python的’=='和’is’用法

    一文讀懂Python的’=='和’is’用法

    探索Python世界的'=='與'is',一個(gè)看似簡(jiǎn)單卻隱藏玄機(jī)的話題,本指南將帶你輕松讀懂它們背后的故事,解鎖編程中的這道難題,開始我們的快速之旅,釋放代碼的潛能吧!
    2024-01-01
  • Python+Turtle制作海龜迷宮小游戲

    Python+Turtle制作海龜迷宮小游戲

    這篇文章主要是帶大家寫一個(gè)利用Turtle庫(kù)制作的一款海龜闖關(guān)的三大迷宮,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,感興趣的可以了解一下
    2022-04-04
  • Python的三種主要模塊介紹

    Python的三種主要模塊介紹

    這篇文章介紹了Python的三類主要模塊,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-07-07

最新評(píng)論

澄城县| 周至县| 双流县| 丰原市| 重庆市| 南丹县| 外汇| 汝州市| 康乐县| 定兴县| 遂溪县| 新竹市| 安图县| 余江县| 余江县| 云林县| 九龙坡区| 河间市| 定陶县| 漠河县| 凤冈县| 临高县| 崇仁县| 永康市| 钟祥市| 秦皇岛市| 景谷| 四会市| 靖州| 灵宝市| 涞水县| 阿拉善右旗| 香格里拉县| 黑水县| 九龙城区| 新巴尔虎左旗| 神木县| 河东区| 高青县| 萝北县| 汉沽区|