仅在Terraform中运行Python代码时出现Module Not Found问题
问题排查与解决方法
根本原因
Python导入包时会从sys.path列表里的路径搜索对应模块,你单独运行脚本时当前工作目录/环境变量PYTHONPATH包含C:\根路径,所以能识别PS这个顶层包;但Terraform的local-exec执行时,默认环境变量和工作目录都和你手动执行的环境不一致,sys.path中缺少C:\路径,因此找不到PS模块。
排查步骤
- 在pr.py文件最开头添加以下代码,分别手动执行和通过Terraform执行,对比输出的路径列表差异:
import sys print(sys.path)
- 确认手动执行时的
sys.path包含C:\,而Terraform执行时输出的路径列表中没有该路径。
解决方法
方法1:在Terraform命令中指定PYTHONPATH环境变量
修改null_resource的command字段,执行Python命令前先把C:\加入PYTHONPATH:
如果local-exec默认用cmd执行:
resource "null_resource" "RPTD" { provisioner "local-exec" { working_dir = "${path.module}\\scripts" command = "set PYTHONPATH=C:\\;%PYTHONPATH% && python pr.py ${var.P_ipaddress}" } triggers = { always_run = "${timestamp()}" } }
如果用PowerShell执行,需要额外指定interpreter:
resource "null_resource" "RPTD" { provisioner "local-exec" { interpreter = ["powershell", "-Command"] working_dir = "${path.module}\\scripts" command = "$env:PYTHONPATH = 'C:\\;$env:PYTHONPATH'; python pr.py ${var.P_ipaddress}" } triggers = { always_run = "${timestamp()}" } }
方法2:在Python脚本中动态添加搜索路径
在pr.py的所有导入语句前添加代码,自动把项目根路径加入sys.path,不需要修改Terraform配置:
import sys from pathlib import Path # pr.py路径为C:\PS\SoFile\Scripts\pr.py,向上回溯4级到C:\根路径 sys.path.append(str(Path(__file__).parents[3].resolve())) # 之后再写原来的导入语句 from PS.Libraries.RUCL import ruc # 注意你原代码写的导入rud,要检查是不是拼写错误,RUCL里定义的类是ruc
额外检查项
- 检查RUCL.py的缩进是否正确,你提供的代码中
cs、suc方法的缩进和__init__不一致,可能会导致类属性无法识别 - 确认你原导入语句
from PS.Libraries.RUCL import rud中的rud是不是拼写错误,RUCL.py中只定义了ruc类,没有rud对象
内容的提问来源于stack exchange,提问作者Sreevathsabr
相关产品推荐
相关产品推荐

