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

问题描述

我正在寻找一种惯用的最佳实践,以便为我的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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...