假设我有以下结构:
app/
__init__.py
mod.py
pkg/
__init__.py
submod.py
其中模块submod
对 具有相对导入mod
,即:
from .. import mod
我知道如果我想submod
作为脚本执行,我可以执行以下操作app/
python -m pkg.submod
但我想submod.py
成为一个可执行模块,我可以从系统中的任何地方调用它
python /path/to/submod.py
我认为PEP-366解决了这个问题,即我认为在我执行任何相关导入之前添加以下样板代码submod
:
if __name__ == "__main__" and __package__ is None:
__package__ = "app.pkg"
然后我可以回到常规python /path/to/submod.py
。但是,当我这样做时,我得到:
SystemError: Parent module 'app' not loaded, cannot perform relative import
为什么?
最后,我知道一种解决方案是进行操作sys.path
,submod
以便它可以看到mod1
然后执行常规import mod1
并避免相对导入。但是作为这个问题所示,这是危险的,因为对一个模块中的任何更改sys.path
都会传播到其他所有模块,所以一般来说,篡改sys.path
.
有没有什么办法:
- 支持常规python /path/to/submod.py的相对导入调用
或者
- 能够使用python /path/to/submod.py执行我的模块而无需篡改
sys.path
或PYTHONPATH
?