首页 >后端开发 >Python教程 >将模块作为脚本运行时如何处理 Python 包中的相对导入?

将模块作为脚本运行时如何处理 Python 包中的相对导入?

Barbara Streisand
Barbara Streisand原创
2024-12-29 15:25:11821浏览

How to Handle Relative Imports in Python Packages When Running Modules as Scripts?

Python 3 中的相对导入

尝试从同一目录中的另一个文件导入函数时,使用 from .mymodule import myfunction 或 from mymodule import myfunction 可以导致错误。原因在于包含要导入的函数的模块是否位于包内。

使用相对导入

当模块位于包内时,相对导入起作用。要创建包,包含模块的目录中必须存在 __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()

在 myothermodule.py 中:

# Import exported function from the mymodule
from .mymodule import as_int

# 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 中:

# Import exported function from myothermodule
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)。

替代方法

有两种替代方法可以解决此问题:

  1. 使用绝对导入:用绝对导入替换相对导入通过指定完整模块路径:from mypackage.mymodule import as_int。但是,这需要将包的父目录添加到 PYTHONPATH 中。
  2. 使用 -m 选项: 要避免使用绝对导入,同时确保模块正确运行,请使用 - Python 的 m 选项:python3 -m mypackage.myothermodule。此方法需要从包的父目录运行命令。

以上是将模块作为脚本运行时如何处理 Python 包中的相对导入?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn