Python 3 中的相對導入:神秘的錯誤
在Python 3 中,相對導入是從同一個模組中導入模組的便捷方法目錄。然而,經常會出現意想不到的錯誤:
錯誤訊息:
根本原因:
要理解這些錯誤,我們必須深入研究Python的模組導入機制。相對導入要求導入模組包含在套件中。包是透過 __init__.py 檔案標記為包的目錄。
常見版面:
套件通常具有以下結構:
main.py mypackage/ __init__.py mymodule.py myothermodule.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()
# 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()
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中文網其他相關文章!