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

python中相對路徑導入的正確用法及錯誤避免方法

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

前言

相對導入只適合包內模塊去使用?。?!

一個 .py 文件一旦使用相對導入,則直接運行該文件一定會報錯:“ImportError: attempted relative import with no known parent package”。

正確的使用方法是:

包內的模塊之間使用相對導入,包外的模塊通過絕對路徑導入去調用這個包中的模塊。

【包內相對導入,包外絕對導入】

示例:

假設現有如下文件結構,main.py 與 package 在同一級目錄。package 是一個文件夾(包),其中包含了模塊 module1.py 和 module2.py 以及包的初始化文件__init__.py。即,main.py在包外,module1.py在包內。

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

 包內相對導入:

現在假設 package 內的模塊 module1 相對導入了同級目錄的模塊 module2 的函數 func2 。

module1.py :

# module1.py
from .module2 import func2

包外間接調用:

main.py :

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

module2.py: 

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

則運行 main.py 的輸出結果是:

func2 

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

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

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

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

2.1 使用方法

假設有一個包結構如下:

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

module1中絕對導入 module2

# module1.py
from package.subpackage import module2

module2.func2()

module2 中絕對導入 module1

# module2.py
from package import module1

module1.func1()

module1中相對導入 module2

# module1.py
from .subpackage import module2

module2.func2()

module2中相對導入 module1

# module2.py
from .. import module1

module1.func1()

2.2 使用場景

絕對導入的使用場景

  • 跨包導入:當需要從一個包導入另一個包中的模塊時,絕對導入是更好的選擇。
  • 清晰的路徑:當模塊結構復雜時,絕對路徑更清晰,便于理解和維護。
  • 避免沖突:在大型項目中,絕對路徑可以避免不同模塊之間的路徑沖突。

相對導入的使用場景

  • 包內部模塊導入:在包內部的模塊之間導入時,相對導入可以使代碼更簡潔。
  • 包的位置可能變化:如果包的位置發(fā)生變化,相對導入可以減少路徑調整的工作量。

2.3 注意事項

相對導入的限制

  • 不能在腳本中使用:如果直接運行腳本(如 python script.py),相對導入會報錯。
  • 僅適用于包內部:相對導入只能在包內部的模塊之間使用,不能在包外部使用。

絕對導入的優(yōu)點

  • 路徑明確:絕對路徑更清晰,便于理解和維護。
  • 避免沖突:在大型項目中,絕對路徑可以避免不同模塊之間的路徑沖突。
  • 適用范圍廣:適用于導入項目中的任何模塊,無論當前模塊的位置如何。

總是實在不行就用絕對導入,只要你的文件位置不會變來變去,包不出錯的。

3. 基礎的 import 語法

3.1 導入方法1:導入整個模塊

先導入整個模塊,再通過模塊名訪問指定對象。 模塊中的所有對象(函數、類、變量等)都可以通過 模塊名.對象名 的方式訪問。例如:

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

優(yōu)點:可以清楚地知道對象來自哪個模塊 & 不會污染當前命名空間。

缺點: 前綴冗長。

3.2 導入方法2:導入模塊中的所有對象

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

from 模塊名 import *
函數名()

優(yōu)點:調用簡潔。

缺點:不清楚哪些對象被導入了 & 可能命名沖突。

3.3 導入方法3:導入模塊中的指定對象

將指定的對象導入到當前命名空間中,可以直接使用對象名調用,而不需要加上模塊名作為前綴。 

from 模塊名 import 函數名, 對象2, ...
函數名()

優(yōu)點:調用簡潔。

缺點是:可能命名沖突。

3.4 導入方法4:別名導入

為模塊設置一個別名,使用別名來訪問模塊中的對象。

為導入的對象設置別名,下面以函數對象為例。

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

這種方法主要用于解決名字過長和命名沖突問題。

4. 包的導入

4.1 導入包中的模塊(當前文件與包在同一級目錄)

如果模塊位于一個包中,可以使用點號(.)來指定路徑。

示例: 假設當前文件結構如下:

main.py

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

( __init__.py 文件不可以缺?。?!不然你之后運行 main.py 會報錯,例如:AttributeError: module 'package' has no attribute 'module1' )

隨后,在 main.py 中,可以這樣導入模塊并使用(假設你在 module1 和 module2 中分別實現了函數 func1 和 func2 ):

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

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

這樣很麻煩對不對?前綴死長死長的。 

4.2 導入包中的對象

可以使用絕對路徑直接導入包中的對象:

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

但是這樣導入,如果包的層次很多怎么辦,那導入語句就會很長?所以接下來講講 __init__.py 怎么用,這才是包的作用!【本質其實有點像是超鏈接】搞完后面的操作你就可以像下面這樣導入并調用包里的函數了:

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

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

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

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

4.3 相對導入(僅適用于包內導入)

在包內部的模塊之間可以使用相對導入。

示例:module1.py 中導入 subpackage/module2.py 中的 func2

from .subpackage.module2 import func2
  • . 表示當前包。
  • .. 表示上一級包。

注意:

  • 相對導入只能在包內部使用,不能在包外部使用。
  • 直接運行使用相對導入的 .py 文件(腳本)會報錯?。。?!

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

5.1 命名沖突

如果導入的對象與當前命名空間中的對象同名,會導致沖突??梢酝ㄟ^別名解決。

示例:

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 語句導入模塊時,python如何識別導入的模塊時哪一個?

Python 會按照以下順序查找模塊:

  • 當前工作目錄(os.getcwd())。
  • PYTHONPATH 環(huán)境變量。
  • 安裝的 Python 包和模塊(標準庫和第三方庫)。

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

將模塊目錄添加到 sys.path

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

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

5.3 循環(huán)依賴

如果兩個模塊相互導入對方,可能會導致循環(huán)依賴問題。盡量避免這種情況,或者通過調整模塊結構來解決。

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

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

相關文章

  • Python日期格式和字符串格式相互轉換的方法

    Python日期格式和字符串格式相互轉換的方法

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

    使用Python輕松實現繪制詞云圖項目(附詳細源碼)

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

    Python進行數組的排序、倒序、截取方式

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

    keras 使用Lambda 快速新建層 添加多個參數操作

    這篇文章主要介紹了keras 使用Lambda 快速新建層 添加多個參數操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python實現讀取mat、tif和hdr格式數據

    Python實現讀取mat、tif和hdr格式數據

    遙感影像數據大多以tif格式或者以hdr格式進行存儲,如果以mat格式進行存儲,不會保留坐標信息,本文將詳細介紹如何使用python來讀取這三種格式的數據,需要的可以參考下
    2023-12-12
  • pycharm 實現調試窗口恢復

    pycharm 實現調試窗口恢復

    這篇文章主要介紹了pycharm 實現調試窗口恢復的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • Python?list?append方法之給列表追加元素

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

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

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

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

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

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

    Python的三種主要模塊介紹

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

最新評論

咸宁市| 洪雅县| 青阳县| 禹州市| 菏泽市| 长丰县| 会昌县| 馆陶县| 普洱| 安宁市| 六安市| 松原市| 金阳县| 甘肃省| 新泰市| 剑河县| 搜索| 凭祥市| 陇南市| 新绛县| 青田县| 新丰县| 临沧市| 林芝县| 灵寿县| 满洲里市| 丹阳市| 永新县| 永宁县| 扎鲁特旗| 平果县| 项城市| 通州市| 阿尔山市| 子洲县| 广安市| 女性| 遂宁市| 木兰县| 都兰县| 绥宁县|