假设我有以下结构:
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
?