Python 读取不到同级 module

在 Python 中,module 是一个独立的文件,可以包含一些函数、类、变量等。当我们需要在一个 Python 文件中使用另一个同级的 module 时,有时会遇到读取不到的问题。这篇文章将介绍一些可能导致这种问题出现的原因,并提供解决方案。

代码示例

# main.py

import module

module.some_function()
# module.py

def some_function():
    print("Hello from module")

在上面的代码示例中,main.py 中尝试导入 module,并调用其 some_function 函数。但是,在运行 main.py 时,可能会遇到 ModuleNotFoundError 异常,提示找不到 module

导入模块的搜索路径

Python 在导入模块时,会在一系列的搜索路径中查找。可以通过 sys.path 列表查看当前的搜索路径:

import sys

print(sys.path)

这个列表包含了一些默认的搜索路径,例如当前工作目录、Python 安装目录、Python 标准库目录等。在搜索路径中,Python 会按照顺序查找模块文件。

相对导入与绝对导入

Python 的导入语句中,可以使用相对导入或绝对导入。

绝对导入是从模块搜索路径中查找模块文件。例如,导入 module 这个模块时,Python 会按照搜索路径中的顺序查找,并加载第一个找到的模块文件。

相对导入是以当前模块所在的位置为基准,相对于当前模块的位置来查找模块文件。例如,使用 from . import module 进行相对导入时,Python 会从当前模块所在的目录中查找 module

解决方案

1. 添加模块路径到搜索路径

如果要导入的模块位于当前目录下,可以通过将当前目录添加到搜索路径中解决问题:

import sys
import os

sys.path.insert(0, os.path.dirname(__file__))

import module

module.some_function()

上面的例子中,使用 sys.path.insert(0, os.path.dirname(__file__)) 将当前文件所在目录添加到搜索路径的最前面。这样,Python 在搜索模块时会先查找当前目录。

2. 使用绝对导入

如果要导入的模块不在当前目录下,可以使用绝对导入解决问题。例如,如果 module 模块位于当前目录的上一级目录中:

from .. import module

module.some_function()

上述代码中,使用 from .. import module 进行相对导入。.. 表示当前目录的上一级目录,Python 会从上一级目录中查找 module

3. 将模块安装到 Python 标准库目录

如果要导入的模块是一个第三方模块,可以将其安装到 Python 标准库目录中。这样,Python 在导入模块时会自动从标准库目录中查找。

可以使用 pip 命令安装第三方模块:

pip install module

安装完成后,就可以直接导入并使用该模块了。

状态图

下面是一个使用 Mermaid 语法绘制的状态图,描述了导入模块时可能遇到的三种情况以及对应的解决方案:

stateDiagram
    [*] --> 导入模块
    导入模块 --> 模块路径存在?
    模块路径存在? --> [*]
    模块路径存在? --> 模块文件存在?
    模块文件存在? --> [*]
    模块文件存在? --> 成功导入

    导入模块 --> 添加模块路径到搜索路径
    添加模块路径到搜索路径 --> 模块文件存在?
    模块文件存在? --> 成功导入

    导入模块 --> 使用绝对导入
    使用绝对导入 --> 模