本身可执行的嵌套模块的导入结构

问题描述

我正在寻找一种惯用的最佳实践,以便为我的Python 3项目提供干净的编码导入结构。

假设我有一个大型项目,带有一个文件一个名为pgk的软件包。该软件包包含一个实用程序模块,该模块具有一些在整个项目中多次使用的功能,即它在main.py以及软件包中的其他模块中都使用过。

我通常更喜欢让每个模块自己执行,这样我就可以使用if __name__ == '__main__:'语句独立开发该模块并将其与项目分开。

我的问题是,由于在mod.py中使用绝对或相对路径导入,代码崩溃。 如何实现main.py以及mod.py作为__main__可执行文件

项目结构:

project/
|-- main.py
|-- pkg/
    |-- __init__.py
    |-- mod.py
    |-- utils.py

代码

#!/usr/bin/env python3
"""main.py"""

import pkg

pkg.utils.tool()
pkg.mod.module_function()

"""pkg/__init__.py"""
import pkg.utils,pkg.mod
"""pkg/utils.py"""
def tool():
    print("tool called\n")
#!/usr/bin/env python3
"""pkg/mod.py"""

from . import utils  # this way `main.py` can be executed without errors
# import utils  # this way `mod.py` can be executed as __main__ without errors

def module_function():
    print(f"module_function invoked for {__name__} calls utils.tool:")
    utils.tool()


if __name__ == '__main__':
    print(f"Invoking mod.py for {__name__}")
    module_function()

main.py的身份执行__main__时的输出

tool called

module_function invoked for pkg.mod calls utils.tool:
tool called

尝试以mod.py身份执行__main__时出错

Traceback (most recent call last):
  File ".../project/pkg/mod.py",line 4,in <module>
    from . import utils
ImportError: cannot import name 'utils'

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)