Python:如何从子包和主包中导入子包模块

3

这是我第一次在stackoverflow上提问。我找过答案,但没有找到清晰明了的答案。这是我的情况:我有一个类似这样的结构:

myapp
    package/
         __init.py__
         main.py
         mod1.py
         mod2.py

现在,在这种情况下,我从main.py导入mod1.py,而mod1.py也需要被mod2.py导入。一切都很顺利,我的导入看起来像这样:

main.py:

from mod1 import Class1

mod2.py:

from mod1 import Class1

然而,我需要将我的main.py移动到主文件夹结构中,就像这样:
myapp
    main.py
    package/
         __init.py__
         mod1.py
         mod2.py

现在需要做的是,在main.py中导入mod1的方式必须进行更改:

from package.mod1 import Class1

然而,为了避免出现“ImportError: No module named 'mod1'”的错误,我需要在mod2.py中做出同样的更改:

from package.mod1 import Class1

为什么会这样呢?mod2与mod1在同一文件夹/包中,因此为什么修改main.py后,我需要修改mod2内部的导入语句呢?

@rassar:是的,它确实可以。 - rbrtk
这种情况发生的原因是因为main和mod2都想导入mod1,而main在层次结构中更高。请参见https://dev59.com/4m_Xa4cB1Zd3GeqPxiBQ?rq=1 - rassar
你尝试过使用 from .mod1 import mod2 吗? - Jean-François Fabre
@Jean-FrançoisFabre:我为什么要这样做?你是指通过mod1作为中间人导入mod2(因为mod1已经先前导入了mod2)吗? - rbrtk
@rbrtk 是的,那是一个很好的表达方式。 - rassar
显示剩余3条评论
1个回答

2
这种情况发生的原因是Python在运行一个作为__main__脚本的Python脚本时,查找模块和包的方式。
当你运行python main.py时,Python会将main.py的父目录添加到Python路径中,这意味着目录中的包和模块可以被导入。当你移动了main.py,你改变了被添加到Python路径中的目录。
通常情况下,你不应该依赖这种机制来导入你的模块,因为它不允许你移动你的脚本,而且只有在运行主脚本时才能导入你的包和模块。你应该确保你的package已经安装到Python路径中的一个目录中。有几种方法可以做到这一点,但最常见的方法是创建一个setup.py脚本,并实际上将你的Python包安装到计算机上的Python安装中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接