Python怎么引入同目录下的py文件

陆遥
陆遥
发布时间:2026-10-27 | 5人浏览过
原创
在 Python 中引入同目录下的 .py 文件,最直接的方法是使用 import 模块名 或 from 模块名 import 函数或类。Python 在启动脚本时,会自动将该脚本所在的当前目录加入模块搜索路径列表 sys.path 的首位,因此同级目录下的模块可以直接导入。

一、同目录文件的导入方式与基础示例

假设我们在同一个项目文件夹 my_project 下存放了两个 Python 文件:一个是提供运算工具的 utils.py,另一个是负责主流程调用的 main.py。

my_project/
├── utils.py     # 工具函数模块
└── main.py      # 主程序入口

在 utils.py 中定义我们需要复用的函数和全局变量:

# utils.py
def get_greeting(name):
    return f"你好,{name}!"

PI = 3.14159

在同目录下的 main.py 中,可以通过两种标准方式进行引入和调用:

1. 直接导入整个模块(推荐)

# main.py
import utils

message = utils.get_greeting("张三")
print(message)
print(f"圆周率近似值:{utils.PI}")

2. 从模块中精确导入指定对象

# main.py
from utils import get_greeting, PI

message = get_greeting("李四")
print(message)
print(f"圆周率近似值:{PI}")
Python怎么引入同目录下的py文件
图 1:同目录下的文件结构与模块依赖关系

二、同目录引入的操作步骤

为了保证引入顺利进行,建议按照以下规范步骤组织和执行代码:

  1. 创建工作目录并放入源码文件:在终端中进入项目专用文件夹,确保两个 .py 文件位于完全平级的同一路径下。
  2. 编写目标模块的功能定义:在被引用文件中实现具体的函数、类或配置对象,避免在模块顶层直接书写耗时的业务主执行语句。
  3. 在主程序顶部声明引入语句:使用 import 语法,并注意文件名与模块名的一致性(不需要写 .py 后缀)。
  4. 在同级目录下执行脚本:在命令行终端定位到该目录后,运行 python main.py 检查输出结果。
Python怎么引入同目录下的py文件
图 2:同目录文件引入与验证的操作步骤

三、底层机制:为什么同目录文件可以直接 import?

很多初学者会疑惑:为什么不需要填写完整的文件路径,Python 就能自动找到同级文件?这背后的核心支撑是 Python 解释器的模块检索机制 sys.path。

当我们在命令行中执行 python main.py 时,Python 解释器在初始化环境时会自动构建一个名为 sys.path 的字符串列表。该列表决定了模块的检索次序:

  • sys.path[0](首位优先级):包含输入脚本的目录路径。如果通过命令行执行脚本,该位置就是被执行脚本所在文件夹的绝对路径;如果是交互式终端,则为空字符串表示当前工作目录。
  • Python 标准库路径:包含 Python 内置模块(例如 os、sys、math 等)。
  • 第三方安装包路径(site-packages):存放通过 pip install 安装的各类依赖库。

因为当前脚本所在的目录始终排在检索路径的最前端,所以 Python 会优先检查同级目录下是否存在同名 .py 文件。一旦匹配成功,解释器就会读取源码、编译字节码并存入内存字典 sys.modules,完成加载。

Python怎么引入同目录下的py文件
图 3:sys.path 搜索机制与同级模块加载链路

四、常见问题排查与注意事项

虽然同目录导入语法非常简明,但在实际工程与 IDE 使用中,经常会遇到以下四种典型异常状况:

1. 报错 ModuleNotFoundError: No module named 'xxx'

原因:执行脚本时的当前工作目录与预期不符。例如在项目的上级目录执行了 python my_project/main.py,或者在集成开发环境(如 VS Code、PyCharm)中将工作区根目录设为了其他路径。虽然直接运行 main.py 时 sys.path[0] 通常会被正确设置为文件所在目录,但如果通过某些启动插件或模块方式启动,可能会遗失该路径。

排查建议:在脚本开头打印 import sys; print(sys.path) 观察首项是否为该脚本所在文件夹;或者在终端中明确 cd 到该脚本所在目录后再运行。

2. 文件名与系统标准库冲突导致的遮蔽效应

原因:如果给同目录下的文件起名为 math.py、random.py、json.py 或 test.py,由于同级目录优先级最高,当其他第三方模块或内置代码尝试 import math 时,会错误加载你写的脚本,引发令人费解的属性缺失或导入报错。

排查建议:自定义模块名称切勿与 Python 内置库或常用第三方包重名,尽量采用业务特征明确的下划线小写命名,例如 calc_utils.py。

3. 循环引用引发的 ImportError

原因:如果在 a.py 中写了 import b,同时在 b.py 中也写了 import a,在模块初次加载未完成时就尝试读取对方的全局属性,会抛出 AttributeError: partially initialized module 'xxx' has no attribute 'yyy'。

排查建议:解耦代码结构,将两个模块共同依赖的数据或辅助方法提取到第三个平级模块(例如 common.py)中,避免形成双向导入回路。

4. 误用相对导入符号 from . import xxx

原因:有些开发者在平级单脚本中写成 from . import utils。当直接使用 python main.py 运行该文件时,Python 会将该脚本的模块名标记为 __main__,不存在上层包信息,从而抛出错误:ImportError: attempted relative import with no known parent package。

排查建议:对于直接作为启动入口的同级文件,不要在同一脚本中混用点号相对导入,直接使用绝对导入语法 import utils 即可。
Python怎么引入同目录下的py文件
图 4:同目录引入常见异常排查与解决方案总结

五、模块导入的核心建议与总结

为了让项目代码结构更清晰、更易维护,建议在实际开发中遵守以下约定:

场景 推荐写法 优点
模块函数较多且可能同名 import utils
通过 utils.func() 调用
命名空间隔离,清晰看出函数归属,防止命名覆盖
仅需要调用个别独立工具函数 from utils import func 调用简洁,代码紧凑
模块名称过长或缩写普遍 import utils as u 减少重复输入,保持命名空间整洁
模块顶层存在测试代码 在被引入模块末尾添加:
if __name__ == '__main__':
保证该模块被引入时不会自动触发自测逻辑

总的来说,引入同目录下的 Python 文件不需要复杂的系统配置,只需确保两个文件处于平级目录,并在主程序中使用标准 import 语句即可快速完成模块拆分与复用。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表