python文件中导入另外一个模块这个模块

针对上文中的 calc_utils.py 模块,在另一个Python文件中导入并使用的核心原则是:确保模块文件与调用文件的路径关系正确,选择合适的导入语法。下面分「同目录」「不同目录」两种最常见场景,给出具体操作方法。

一、场景1:调用文件与模块文件在同一目录(最常用)

假设文件结构如下(两个文件在同一个文件夹下):

bash 复制代码
my_project/
  ├─ calc_utils.py  # 自定义模块
  └─ test.py        # 调用模块的文件

此时有3种导入方式,可按需选择:

方式1:导入整个模块,通过「模块名.成员」调用

python 复制代码
# test.py
# 导入整个calc_utils模块
import calc_utils

# 1. 访问模块中的变量
print("模块版本:", calc_utils.CALC_VERSION)

# 2. 调用模块中的函数
sum_result = calc_utils.add(10, 25)
print("10+25 =", sum_result)

# 3. 使用模块中的类
calc = calc_utils.AdvancedCalculator()
print("累加30:", calc.accumulate(30))

方式2:导入模块的指定成员(函数/类/变量),直接调用

适合仅需使用模块中部分功能的场景,代码更简洁:

python 复制代码
# test.py
# 导入模块中的指定函数、类、变量
from calc_utils import add, AdvancedCalculator, CALC_VERSION

# 直接使用,无需加模块名前缀
print("版本:", CALC_VERSION)
print("5+8 =", add(5, 8))

adv_calc = AdvancedCalculator()
print("累加100:", adv_calc.accumulate(100))

方式3:导入模块并指定别名(模块名过长时适用)

如果模块名较长(比如 calculator_utils.py),可给模块起别名,简化调用:

python 复制代码
# test.py
# 给模块指定别名cu
import calc_utils as cu

print("版本:", cu.CALC_VERSION)
print("12×5 =", cu.multiply(12, 5))

calc = cu.AdvancedCalculator()
print("累乘2:", calc.multiply_accumulate(2))

二、场景2:调用文件与模块文件在不同目录

假设文件结构如下(模块在子目录,调用文件在上级目录):

bash 复制代码
my_project/
  ├─ utils/          # 子目录
  │  └─ calc_utils.py # 模块文件
  └─ test.py         # 调用文件

此时需要先让Python找到模块的路径,有2种可靠方法:

方法1:通过「包导入」(推荐,工程化用法)

步骤1:在 utils 目录下新建 __init__.py 文件(空文件即可,用于标识该目录为Python包),结构变为:

markdown 复制代码
my_project/
  ├─ utils/
  │  ├─ __init__.py
  │  └─ calc_utils.py
  └─ test.py

步骤2:在 test.py 中导入(支持多种写法):

python 复制代码
# 写法1:导入包下的模块
import utils.calc_utils as cu

print(cu.add(3, 7))

# 写法2:直接导入模块中的成员
from utils.calc_utils import multiply, AdvancedCalculator

print(multiply(4, 9))

方法2:临时添加模块路径(快速测试用)

如果不想创建 __init__.py,可在调用文件中手动将模块所在目录加入Python搜索路径:

python 复制代码
# test.py
import sys
# 将utils目录的绝对路径添加到搜索路径(请替换为你自己的实际路径)
# 相对路径写法:sys.path.append("./utils")(推荐,无需改绝对路径)
sys.path.append("./utils")

# 之后即可像同目录一样导入
import calc_utils

print(calc_utils.add(8, 9))

三、运行与验证

无论哪种方式,运行 test.py 即可:

  1. 打开终端/命令行,进入 my_project 目录;
  2. 执行 python test.py;
  3. 正常输出计算结果,说明导入成功。

四、常见问题与避坑

  1. 报错「ModuleNotFoundError: No module named 'calc_utils'」

    • 检查模块文件名是否拼写正确(比如少写 _、大小写错误);
    • 检查调用文件与模块文件的路径是否符合上述场景;
    • 若用「方法2」,确认添加的路径是模块所在目录的正确路径。
  2. 导入后修改模块代码,运行test.py不生效

    • Python会缓存导入的模块,修改后需重启 test.py;

    • 若需动态重载,可添加以下代码:

      python 复制代码
      import calc_utils
      import importlib
      importlib.reload(calc_utils)  # 重新加载模块,读取最新代码
  3. 模块名与Python内置模块重名(比如命名为 math.py)

    • 会覆盖内置模块,导致 import math 导入的是自定义模块而非系统模块;
    • 解决:修改自定义模块名(比如改为 my_math.py)。
相关推荐
言乐63 小时前
HTML视频审核模型
python·django·virtualenv·pygame·tornado
言乐64 小时前
Python根据无法识别搜索词找出可能输入内容模型
开发语言·python·django·virtualenv·pygame
yl45305 小时前
硫酸泄露处理生产商怎么选才够专业
大数据·人工智能·python
笨笨饿5 小时前
140_AI新手村MCP与Skills是干嘛的
开发语言·人工智能·python·stm32·单片机·嵌入式硬件·物联网
for_ever_love__6 小时前
机器学习入门——手写线性回归与梯度下降
人工智能·python·学习·机器学习·线性回归
打工仔折腾 AI6 小时前
从 Demo 到生产级 Agent:8 个关键设计机制与 Python 实现拆解
java·jvm·人工智能·后端·python·langchain·ai agent 实战
I Am a robert girl6 小时前
当传感器学会“说谎“:拆解可靠性门控的稀疏惯性动捕融合
python·姿态估计·传感器融合·惯性动捕·imu传感器·可靠性门控·可穿戴计算
李航19837 小时前
AI定制柜建模,需要详细的建模规范和标准流程
人工智能·python·计算机视觉·ai·ai编程
沙漠之主7 小时前
Python 教学设计资料:从入门到实战的完整课程方案
爬虫·python
ebiobiz8 小时前
极海 APM32 使用 Nimmake 编译指南
c++·python·单片机·嵌入式硬件·mcu