首頁 > 後端開發 > Python教學 > 為什麼 Python 3 中的相對導入會失敗,如何修復它們?

為什麼 Python 3 中的相對導入會失敗,如何修復它們?

Mary-Kate Olsen
發布: 2024-12-27 14:49:17
原創
962 人瀏覽過

Why Do Relative Imports in Python 3 Fail, and How Can I Fix Them?

Python 3 中的相對導入:神秘的錯誤

在Python 3 中,相對導入是從同一個模組中導入模組的便捷方法目錄。然而,經常會出現意想不到的錯誤:

錯誤訊息:

  • ImportError:嘗試在沒有已知父包的情況下進行相對導入
  • ModuleNotFoundError:沒有名為“mymodule”的模組
  • 系統錯誤:父模組“未載入”,無法執行相對導入

根本原因:

要理解這些錯誤,我們必須深入研究Python的模組導入機制。相對導入要求導入模組包含在套件中。包是透過 __init__.py 檔案標記為包的目錄。

常見版面:

套件通常具有以下結構:

main.py
mypackage/
    __init__.py
    mymodule.py
    myothermodule.py
登入後複製

範例程式碼:

  • mymodule.py
# Exported function
def as_int(a):
    return int(a)

# Test function for module  
def _test():
    assert as_int('1') == 1

if __name__ == '__main__':
    _test()
登入後複製
  • myoth ermodule.py
# Exported function
def add(a, b):
    return as_int(a) + as_int(b)

# Test function for module  
def _test():
    assert add('1', '1') == 2

if __name__ == '__main__':
    _test()
登入後複製
  • main.py
from mypackage.myothermodule import add

def main():
    print(add('1', '1'))

if __name__ == '__main__':
    main()
登入後複製

何時你運行 main.py 或 mypackage/mymodule.py,一切順利。但是,由於相對導入,運行mypackage/myothermodule.py 失敗:

from .mymodule import as_int
登入後複製

解決方案:

如Guido van Rossum 所解釋的,此失敗是由於Python 將套件內運行的腳本視為反模式。建議的解決方案是避免相對導入並使用絕對導入:

from mypackage.mymodule import as_int
登入後複製

替代方法:

如果您仍然喜歡相對導入,則可以使用- m 選項指定要匯入的模組,但它可能很冗長且不方便:

python3 -m mypackage.myothermodule
登入後複製

另一個另一種方法是操作PYTHONPATH 以包含套件的父目錄:

import sys
import os

SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.append(os.path.dirname(SCRIPT_DIR))

from mypackage.mymodule import as_int
登入後複製

以上是為什麼 Python 3 中的相對導入會失敗,如何修復它們?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板