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

Posted

技术标签:

【中文标题】Python 2.7 在其搜索路径中找不到模块【英文标题】:Python 2.7 cannot find module in its search path 【发布时间】:2020-09-10 18:56:53 【问题描述】:

我想测试一下 Python 2.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 找不到它。我很确定 import 语句的语法是正确的。

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

【问题讨论】:

【参考方案1】:

您必须在 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。

【讨论】:

以上是关于Python 2.7 在其搜索路径中找不到模块的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Windows 8 上安装 netCDF4 时出现“需要 Python 版本 2.7,在注册表中找不到”错误

google-cloud-sdk 安装在 CentOS /usr/local/bin 中找不到正确的 Python 2.7 版本

python2.6 2.7 升级成3.6之后yum

python教程:模块的搜索路径

在 MATLAB 的搜索路径中找不到 MATLAB 超类

在 .gitmodules 中找不到路径“LibTecho”的子模块映射