想象一下这个目录结构:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
我正在编码mod1,我需要从中导入mod2。我应该怎么做?
我试过,from ..sub2 import mod2但我得到了一个“非包装尝试相对导入”。
我google搜索,但只发现“ sys.path操纵”黑客。有没有一个干净的方式?
编辑:我所有__init__.py的都是空的
EDIT2:我想这样做,因为SUB2包含了为子包(共享类sub1,subX等等)。
编辑3:我正在寻找的行为是相同的PEP 366
main.py
setup.py
app/ ->
__init__.py
package_a/ ->
__init__.py
module_a.py
package_b/ ->
__init__.py
module_b.py
另外2或3可以使用: from app.package_a import module_a
只要你有app你的PYTHONPATH,这将工作。main.py那么可以在任何地方。
所以,你写一个setup.py将整个应用程序包和子包复制(安装)到目标系统的python文件夹,并定位main.py到系统的脚本文件夹。
个人似乎都想告诉你应该做什么,而不是仅仅回答这个问题。
问题在于,通过将mod1.py作为参数传递给解释器,将模块作为“__main__”运行。
从PEP 328:
相对导入使用模块的__name__属性来确定模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它被设置为'__main__'),那么无论模块实际位于文件系统的哪个位置,相对导入都会被解析为模块是顶级模块。
在Python 2.6中,他们增加了相对于主模块引用模块的能力。 PEP 366描述了这种变化。
更新:根据Nick Coghlan,推荐的替代方法是使用-m开关在软件包内部运行模块。