2

如果我有一个小的 python 项目拆分成一个带有 2 个子目录的主目录:

src/
    run.py
    subdir1/
            __init__.py
            module1.py
            subdir2/
                    __init__.py
                    module2.py

为了在 module1 中包含 module2,我必须使用完整的包含路径:(from subdir1.subdir2.module2 import Class2相对于正在运行的 python 文件),还是可以使用from subdir2.module2 import Class2?(相对于该语句所在的文件)

src/
    run.py
    subdir1/
            __init__.py
            module1.py
    subdir2/
            __init__.py
            module2.py

现在最好将module2包含在module1from subdir2.module2 import Class2"No module named module2"吗相对于该语句所在文件的路径,尤其是在第一个示例中。

我假设如果我从另一个活动目录调用代码,它不会搞砸,还是会这样?python dir/run.py

谢谢!

4

1 回答 1

3

导入模块有两种方式:

  1. 绝对进口
  2. 相对进口

sys.path 绝对导入使 python 在存储在相对于当前模块的相对导入地址到模块的目录中查找所需的模块。您只能在 python 包中使用相对导入。

对于第一种情况,您可以使用相对导入,因为subdir1它是一个包

对于第二个,您不能使用相对导入,因为subdir1并且subdir2不在包中。

根据 pep-8:

建议使用绝对导入,因为如果导入系统配置不正确(例如当包内的目录最终位于 sys.path 上时),它们通常更具可读性并且往往表现更好(或至少提供更好的错误消息):

import mypkg.sibling
from mypkg import sibling
from mypkg.sibling import example

但是,显式相对导入是绝对导入的可接受替代方案,尤其是在处理复杂的包布局时,使用绝对导入会不必要地冗长:

from . import sibling
from .sibling import example

标准库代码应避免复杂的包布局并始终使用绝对导入。

不应该使用隐式相对导入,并且在 Python 3 中已将其删除。

于 2013-11-05T11:16:44.400 回答