在 Python 程序运行时,如何调用另一个 .py 文件中的函数,这是 Python 开发中非常基础且常用的操作,核心是通过模块导入实现(Python 中一个 .py 文件就是一个独立的模块)。下面分不同场景详细讲解,包含可直接运行的示例。
一、核心前提
Python 中,被调用的文件必须是合法的 .py 文件(后缀为 .py),且文件名称不能与 Python 内置模块(如 os、sys、math 等)重名,否则会引发命名冲突。
本文介绍了在 Python 程序运行时调用其他 .py 文件中函数的三种场景。核心原理是模块导入。同一目录下可直接导入;子目录需作为包导入(含 __init__.py);非同级目录需通过 sys.path 添加搜索路径。文章提供了代码示例及命名规范、循环导入等注意事项。
在 Python 程序运行时,如何调用另一个 .py 文件中的函数,这是 Python 开发中非常基础且常用的操作,核心是通过模块导入实现(Python 中一个 .py 文件就是一个独立的模块)。下面分不同场景详细讲解,包含可直接运行的示例。
Python 中,被调用的文件必须是合法的 .py 文件(后缀为 .py),且文件名称不能与 Python 内置模块(如 os、sys、math 等)重名,否则会引发命名冲突。
文件结构
├── func_module.py # 被调用的文件(存放待调用的函数)
└── main_program.py # 主程序文件(运行时调用其他文件的函数)
func_module.py)在该文件中定义需要被调用的函数(普通函数定义即可,无特殊格式要求):
# func_module.py
def add(a, b):
"""简单的加法函数,用于被其他文件调用"""
return a + b
def multiply(a, b):
"""简单的乘法函数,用于被其他文件调用"""
return a * b
# 可选:防止该文件被直接运行时执行多余代码(仅被导入时不执行以下内容)
if __name__ == "__main__":
print("这是被调用的模块文件,不是主程序!")
main_program.py)有两种常用导入方式,可根据需求选择:
方式 1:导入整个模块,通过「模块名。函数名」调用
# 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:直接导入模块中的指定函数(推荐,减少冗余)
# 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:导入函数并指定别名(解决命名冲突)
# 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,输出:
3+5=8
4×6=24
当项目文件较多时,会将功能模块放在子目录中,此时需要通过「包导入」实现。
文件结构
├── main_program.py # 主程序文件
└── utils/ # 子目录(作为 Python 包)
├── __init__.py # 包标识文件(Python3.3+ 可省略,但推荐创建,空文件即可)
└── func_module.py # 被调用的函数文件
关键说明
__init__.py 的作用是标识当前目录为 Python 的「包」,使得目录下的 .py 文件可以被作为模块导入,该文件可以是空文件,也可以存放包的初始化配置。
utils/func_module.py)内容与场景 1 中的 func_module.py 一致,无需修改。
main_program.py)需指定「包名(子目录名)。模块名」进行导入:
# 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}")
如果主程序文件在子目录,需要调用上层目录(或其他非同级目录)的函数,需要先将目标目录添加到 Python 的搜索路径中(Python 默认只搜索当前目录和内置模块目录)。
文件结构
├── func_module.py # 被调用的函数文件(父目录)
└── src/ # 子目录
└── main_program.py # 主程序文件(需要调用上层的 func_module.py)
src/main_program.py)通过 sys.path 添加父目录路径,再进行导入:
# 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}")
os.py、sys.py)。__name__ == "__main__" 的作用:被调用文件中的该判断代码块,只有在该文件被直接运行时才会执行,被其他文件导入时不会执行,可用于模块自测,不影响主程序运行。importlib.reload() 强制重新加载模块)。.py 文件有读取权限,否则会引发导入失败。A.py 导入 B.py 的函数,B.py 又导入 A.py 的函数),会引发 ImportError,如需解决可通过延迟导入(在函数内部导入)。.py 文件就是一个模块。import 模块名 或 from 模块名 import 函数。包名。模块名。sys.path 添加目标目录到搜索路径,再进行导入。
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online