解决通过文件路径导入模块引发的ModuleNotFoundError
解决
ModuleNotFoundError: No module named 'lambda_context'的几种实用方案 方案1:给测试代码添加模块搜索路径
在test_my_lambda.py里,导入lambda_function之前,把lambda-1目录加到Python的模块搜索路径里,这样Python就能找到同目录下的lambda_context.py:
import sys from pathlib import Path import importlib.util # 自动获取项目根目录,避免硬编码路径 project_root = Path(__file__).parent.parent.parent lambda_1_dir = project_root / "lambdas" / "lambda-1" sys.path.append(str(lambda_1_dir)) # 继续原本的导入逻辑 spec = importlib.util.spec_from_file_location("lambda_function", lambda_1_dir / "lambda_function.py") module_name = importlib.util.module_from_spec(spec) spec.loader.exec_module(module_name)
方案2:把lambda_function的导入改成相对导入
修改lambda_function.py里的导入语句,用相对路径引用同目录的模块:
from .lambda_context import SomeClass from .lambda_context import function_xyz
然后在测试代码里,把lambdas目录加到sys.path,再以包的形式导入lambda_function:
import sys from pathlib import Path project_root = Path(__file__).parent.parent.parent sys.path.append(str(project_root / "lambdas")) # 从lambda-1包导入目标模块 from lambda_1 import lambda_function as module_name
方案3:换个目录运行pytest
别在tests目录下执行命令,直接回到项目根目录运行:
c:\path_to_project_root> python -m pytest tests/unit/test_my_lambda.py
这种情况下,配合方案2的相对导入,或者给lambda-1目录加个空的__init__.py(把它变成Python包),就能正常导入了。
方案4:将lambda-1转为Python包
在lambdas/lambda-1目录下创建一个空的__init__.py文件,让它成为可导入的包:
. Root |--lambdas/ | |-- lambda-1/ | |-- __init__.py | |-- lambda_function.py | |-- lambda_context.py |-- tests | -- unit |-- test_my_lambda.py
然后测试代码里可以直接从根目录导入:
import sys from pathlib import Path project_root = Path(__file__).parent.parent.parent sys.path.append(str(project_root)) from lambdas.lambda_1 import lambda_function as module_name
这种方式最规范,适合长期维护的项目。
内容的提问来源于stack exchange,提问作者kal
相关产品推荐
相关产品推荐

