假设有这样的目录结构
main/
common/
foo.py
A/
src/
bar.py
我如何使用Python的相对导入从bar
中导入foo
? 我已经通过将其添加到路径来找到了一个可行的解决方案,但这很丑陋。 在Python 2.7中有没有一种简单的方法可以使用单个import
实现?
这是一个更复杂的问题的版本:
假设有这样的目录结构
main/
common/
foo.py
A/
src/
bar.py
我如何使用Python的相对导入从bar
中导入foo
? 我已经通过将其添加到路径来找到了一个可行的解决方案,但这很丑陋。 在Python 2.7中有没有一种简单的方法可以使用单个import
实现?
这是一个更复杂的问题的版本:
正确的相对导入应该是这样:
from ...common import foo
相对导入仅适用于一个包内部。如果main
是一个包,那么可以在此处使用相对导入。如果main
不是一个包,则不能使用。
因此,如果你正在运行位于/main/
目录下的脚本,并执行类似import A.src.bar
这样的操作,则该相对导入将会失败并提示"Attempted relative import beyond toplevel package"。这是因为相对导入试图导入顶层包A
之外的内容。
但是,如果你正在运行位于/
目录下的脚本,并执行类似import main.A.src.bar
这样的操作,则该相对导入将会成功,因为main
现在是一个包。在这种情况下,以下两者将是等效的:
from ...common import foo
from main.common import foo
为了回答你的评论: .
的意义不会因为脚本执行的位置而改变,它会根据包结构的不同而改变。
回答你的评论: .
的意思并不取决于脚本运行的位置,而是取决于包的结构。
cd path2/A
ln -s path2/main/common common
from A.common.foo import class
__init__.py
并将以下代码放入其中,以使其成为包中的顶级文件夹:__package__ = ''
from ...common import foo