Python中如何实现一个程序运行时,调用另一文件中的函数

在 Python 程序运行时,如何调用另一个.py文件中的函数,这是 Python 开发中非常基础且常用的操作,核心是通过模块导入 实现(Python 中一个.py文件就是一个独立的模块)。下面分不同场景详细讲解,包含可直接运行的示例。

一、核心前提

Python 中,被调用的文件必须是合法的.py文件 (后缀为.py),且文件名称不能与 Python 内置模块(如ossysmath等)重名,否则会引发命名冲突。

二、场景 1:两个文件在同一目录下(最常用)

文件结构

python 复制代码
├── func_module.py  # 被调用的文件(存放待调用的函数)
└── main_program.py  # 主程序文件(运行时调用其他文件的函数)

步骤 1:编写被调用文件(func_module.py

在该文件中定义需要被调用的函数(普通函数定义即可,无特殊格式要求):

python 复制代码
# func_module.py
def add(a, b):
    """简单的加法函数,用于被其他文件调用"""
    return a + b

def multiply(a, b):
    """简单的乘法函数,用于被其他文件调用"""
    return a * b

# 可选:防止该文件被直接运行时执行多余代码(仅被导入时不执行以下内容)
if __name__ == "__main__":
    print("这是被调用的模块文件,不是主程序!")

步骤 2:主程序文件调用函数(main_program.py

有两种常用导入方式,可根据需求选择:

方式 1:导入整个模块,通过「模块名。函数名」调用

python 复制代码
# main_program.py
# 导入同一目录下的func_module模块(即func_module.py文件)
import func_module

# 调用模块中的函数,格式:模块名.函数名(参数)
result1 = func_module.add(3, 5)
result2 = func_module.multiply(4, 6)

print(f"3+5={result1}")
print(f"4×6={result2}")

方式 2:直接导入模块中的指定函数(推荐,减少冗余)

python 复制代码
# main_program.py
# 从func_module模块中导入add和multiply函数,可直接调用
from func_module import add, multiply

# 直接使用函数名调用,无需加模块前缀
result1 = add(3, 5)
result2 = multiply(4, 6)

print(f"3+5={result1}")
print(f"4×6={result2}")

方式 3:导入函数并指定别名(解决命名冲突)

python 复制代码
# main_program.py
# 导入函数并设置别名,避免与当前文件中的同名函数冲突
from func_module import add as my_add, multiply as my_mul

# 使用别名调用函数
result1 = my_add(3, 5)
result2 = my_mul(4, 6)

print(f"3+5={result1}")
print(f"4×6={result2}")

运行结果

运行main_program.py,输出:

python 复制代码
3+5=8
4×6=24

三、场景 2:被调用文件在子目录下(按包组织文件)

当项目文件较多时,会将功能模块放在子目录中,此时需要通过「包导入」实现。

文件结构

python 复制代码
├── main_program.py  # 主程序文件
└── utils/  # 子目录(作为Python包)
    ├── __init__.py  # 包标识文件(Python3.3+可省略,但推荐创建,空文件即可)
    └── func_module.py  # 被调用的函数文件

关键说明

__init__.py的作用是标识当前目录为 Python 的「包」,使得目录下的.py文件可以被作为模块导入,该文件可以是空文件,也可以存放包的初始化配置。

步骤 1:编写子目录中的函数文件(utils/func_module.py

内容与场景 1 中的func_module.py一致,无需修改。

步骤 2:主程序文件调用(main_program.py

需指定「包名(子目录名). 模块名」进行导入:

python 复制代码
# main_program.py
# 方式1:导入子目录下的模块
import utils.func_module

result1 = utils.func_module.add(3, 5)
print(f"3+5={result1}")

# 方式2:直接导入子目录模块中的函数
from utils.func_module import multiply

result2 = multiply(4, 6)
print(f"4×6={result2}")

# 方式3:导入并指定别名
from utils import func_module as utils_func

result3 = utils_func.add(10, 20)
print(f"10+20={result3}")

四、场景 3:被调用文件在父目录 / 其他非同级目录

如果主程序文件在子目录,需要调用上层目录(或其他非同级目录)的函数,需要先将目标目录添加到 Python 的搜索路径中(Python 默认只搜索当前目录和内置模块目录)。

文件结构

python 复制代码
├── func_module.py  # 被调用的函数文件(父目录)
└── src/  # 子目录
    └── main_program.py  # 主程序文件(需要调用上层的func_module.py)

实现步骤(src/main_program.py

通过sys.path添加父目录路径,再进行导入:

python 复制代码
# src/main_program.py
import sys
import os

# 1. 获取当前文件(main_program.py)的绝对路径
current_file_path = os.path.abspath(__file__)
# 2. 获取当前文件所在目录(src目录)
current_dir = os.path.dirname(current_file_path)
# 3. 获取父目录(即func_module.py所在目录)
parent_dir = os.path.dirname(current_dir)
# 4. 将父目录添加到Python的模块搜索路径中
sys.path.append(parent_dir)

# 5. 此时即可像同级目录一样导入函数
from func_module import add, multiply

# 6. 调用函数
result1 = add(3, 5)
result2 = multiply(4, 6)

print(f"3+5={result1}")
print(f"4×6={result2}")

五、关键注意事项

  1. 命名规范 :模块文件名称建议使用小写字母、下划线,避免使用中文、空格和特殊字符,且不能与 Python 内置模块重名(如不能命名为os.pysys.py)。
  2. __name__ == "__main__"的作用 :被调用文件中的该判断代码块,只有在该文件被直接运行时才会执行,被其他文件导入时不会执行,可用于模块自测,不影响主程序运行。
  3. 导入后修改生效问题 :如果在程序运行过程中修改了被调用文件的函数,当前运行的程序不会实时生效,需要重启程序(或使用importlib.reload()强制重新加载模块)。
  4. 权限问题 :确保主程序对被调用的.py文件有读取权限,否则会引发导入失败。
  5. 循环导入问题 :避免两个文件互相导入对方的函数(如A.py导入B.py的函数,B.py又导入A.py的函数),会引发ImportError,如需解决可通过延迟导入(在函数内部导入)。

总结

  1. Python 中调用另一文件的函数,核心是模块导入 ,一个.py文件就是一个模块。
  2. 同级目录直接用import 模块名from 模块名 import 函数
  3. 子目录需以「包」的形式导入,格式为包名.模块名
  4. 非同级目录需先通过sys.path添加目标目录到搜索路径,再进行导入。
  5. 遵循命名规范,避免循环导入和命名冲突,确保程序稳定运行。
相关推荐
傲笑风3 小时前
【openvino】tinybert基于openvino服务化部署(四)
人工智能·python·自然语言处理·nlp·bert·openvino
维基框架3 小时前
WIKI 知识库 v1.1.1 正式发布
人工智能·python
谢白羽7 小时前
SGLang的AWQ量化笔记
笔记·python·sglang
迷迭香yy7 小时前
基金档案数据工程实战从收入分析到持仓穿透的Python解析 IG50免费开源股票数据API接口
开发语言·python
清水白石0088 小时前
Python 类型设计深度解析:TypedDict 能否替代 dataclass?从 JSON 数据边界到 API 设计的最佳实践
java·python·json
️学习的小王8 小时前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
前端 贾公子8 小时前
第09章:上下文与记忆 (6)
开发语言·前端·python
evans在进步8 小时前
Java 常用设计模式入门:建造者、工厂、单例、外观与代理
java·python·设计模式
jayson.h9 小时前
PDF 合并+添加页码 相关库、类、函数
开发语言·前端·python
典典分享指南9 小时前
用飞书多维表格搭建内容管理看板
java·python·r语言·composer·symfony