首页 > 后端开发 > Python教程 > 为什么 Python 3 中的相对导入会失败,如何修复它们?

为什么 Python 3 中的相对导入会失败,如何修复它们?

Mary-Kate Olsen
发布: 2024-12-27 14:49:17
原创
961 人浏览过

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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板