Python 2.7 在其搜索路径中找不到模块

Python 2.7 cannot find module in its search path

我想测试Python2.X

的相对导入模型

目录树:

exercises/
    dir1/
        dir2/
            mod.py
            dir3/
                mod2.py
                mod3.py

mod.py

import sys
print 'in dir1/dir2/mod.py'
path = [name for name in sys.path if 'Frameworks' not in name]. 
print 'Module search path of mod is:\n' + str(path)

import dir3.mod2

mod2.py

print 'in dir1/dir2/dir3/mod2.py' 
import mod3

mod3.py

print 'in dir1/dir2/dir3/mod3.py by relative import'

'mod' 将从 'dir3' 导入 'mod2',然后导入 'mod3'。在 Python 3.X 中,这将失败,因为未提供 'mod3' 的路径;在 Python 2.X 中,解释器搜索包含 'mod2' 的相同目录,然后从 'mod' 的顶级目录开始搜索其余路径。

这是我收到的错误消息:

MacBook-Pro-9 exercises % python dir1/dir2/mod.py
in dir1/dir2/mod.py
Module search path of mod is:
['Users/arthur/Desktop/learning_python/exercises/dir1/dir2', '/Library/Python/2.7/site-packages']
Traceback (most recent call last):
  File "Desktop/learning_python/exercises/dir1/dir2/mod.py", line 8, in <module>
    import dir3.mod2
ImportError: No module named dir3.mod2

我知道 'dir2' 包含 'dir3/mod2',但由于某些原因,Python 找不到它。我很确定导入语句的语法是正确的。

我修改了打印语句并将 'mod2.py' 代码更改为 from . import mod3。我没有编辑其他东西,它 运行 在 Python 3.8 中没问题找到 'dir3.mod2'

您必须在 dir3 中添加一个名为 init.py 的空文件,以便 python 能够将该目录识别为 Python 包目录.如果你有这些文件

dir3/__init__.py
dir3/mod2.py
dir3/mod3.py

您现在可以将 mod2.py 和 mod3.py 中的代码导入为

import dir3.mod2
import dir3.mod3

from dir3 import mod2
from dir3 import mod3

如果删除 init.py 文件,Python 将不再在该目录中查找子模块,因此尝试导入模块将失败。

这里是 a link.