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中文网其他相关文章!