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