首頁 >後端開發 >Python教學 >為什麼在 Python 中出現「嘗試在非套件中進行相對導入」?

為什麼在 Python 中出現「嘗試在非套件中進行相對導入」?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-21 13:31:09796瀏覽

Why Do I Get

Python 中的相對導入

在使用相對導入時,經常會出現「嘗試在非套件中進行相對導入」的常見錯誤Python。本文旨在闡明相對導入的概念並提供解決此錯誤的解決方案。

腳本和模組之間的差異

主要區別在於 Python 檔案的方式已載入。直接使用 python myfile.py 執行的檔案被視為頂級腳本。相反,在另一個檔案中使用 import 語句導入的檔案是一個模組。這種區別對於理解相對導入至關重要。

命名的重要性

載入後,每個檔案都會被指派一個儲存在 name 屬性中的名稱。如果作為腳本加載,其名稱將設定為 __main__。如果以模組匯入,其名稱會反映其所屬的套件和檔案名稱。

例如,在提供的目錄結構中:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

導入 moduleX 將為它指派名稱package.subpackage1.moduleX,而導入 moduleA 時會產生 package.moduleA 的名稱。但是,直接執行任一模組都會將其 name 設定為 __main__,從而抑制套件資訊。

相對導入

相對導入使用以下方式導覽包層次結構模組的名稱。例如, from .. import foo 表示在層次結構中向上移動。使用 from .. import 進行升序需要模組名稱中包含足夠的點。

非包裝模組

但是,名稱缺少點的模組不被視為模組的一部分一個包裹。因此,相對導入會因此類別模組中的非包錯誤而失敗。

解決方案

要解決該錯誤,請考慮以下解決方案:

  1. 將模組作為包執行: 使用python -m package.subpackage1.moduleX 載入模組不會將其作為腳本執行。
  2. 將執行與導入分開:在包目錄外部運行腳本並從其中導入模組以啟用相對導入。

以上是為什麼在 Python 中出現「嘗試在非套件中進行相對導入」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn