问题
将代码组织成包,想用import语句从另一个包名没有硬编码过的包的中导入子模块。
解决方案
使用包的相对导入,使一个的模块导入同一个包的另一个模块 举个例子,假设在你的文件系统上有mypackage包,组织如下:
mypackage/
__init__.py
A/
__init__.py
spam.py
grok.py
B/
__init__.py
bar.py
如果模块mypackage.A.spam要导入同目录下的模块grok,它应该包括的import语句如下:
# mypackage/A/spam.py
from . import grok
如果模块mypackage.A.spam要导入不同目录下的模块B.bar,它应该使用的import语句如下:
# mypackage/A/spam.py
from ..B import bar
两个import语句都没包含顶层包名,而是使用了spam.py的相对路径。
讨论
在包内,既可以使用相对路径也可以使用绝对路径来导入。 举个例子:
# mypackage/A/spam.py
from mypackage.A import grok # OK
from . import grok # OK
import grok # Error (not found)
像mypackage.A这样使用绝对路径名的不利之处是这将顶层包名硬编码到你的源码中。如果你想重新组织它,你的代码将更脆,很难工作。 举个例子