我试图创建一个处理来自其他脚本的错误和警告的脚本,它可以是其他python或bash脚本。
我发现这样做的唯一方法是使用Popen,我使用Popen执行脚本并将stderr存储到变量中。
检查Popen的返回码我可以说stderr是一个警告(返回码为0,脚本是否成功运行)或者它是否实际上是一个错误(返回码1,脚本没有成功运行)。
但是有一些脚本即使出错也会继续执行命令,因此返回码为0,就像是一些警告或脚本确实成功运行一样。我怎么能处理这类事情?
以下是一些获得充分理解的示例:
sshpass -p password sftp -q username@host << EOF
cd Export
get file.csv
EOF
这个bash脚本给我一个错误,它无法找到file.csv,好的。
File "/Export/file.csv" not found.
这个python脚本执行上面的脚本。
script = 'bash_script'
proc = subprocess.Popen("bash {}.sh ".format(script), stderr=subprocess.PIPE, shell=True)
(stdout, stderr) = proc.communicate()
if (proc.returncode) and (stderr != ''):
print("\n[ERROR]:\n" + str(stderr))
elif (not proc.returncode) and (stderr != ''):
print("\n[WARNING]:\n" + str(stderr))
else # (not proc.returncode) and (stderr == '')
print("\n[SUCCESS]\n")
但执行上面的脚本我得到:
[WARNING]:
File "/Export/file.csv" not found
应该是:
[ERROR]:
File "/Export/file.csv" not found
这是因为返回码为0并且错误按预期发送到stderr。
我该如何处理这个案子?将错误与警告区分开来的最佳方法是什么?为什么sftp命令在返回1时返回0,这对应于错误?
答案 0 :(得分:0)
我建议你在bash脚本中实现日志记录,而不是试图完全从python中完成。在python中,您只需从日志中读取错误,如:
fault = ""
error = ""
warning = ""
with open('log.txt','r') as f:
x = f.readline()
if 'error' in x.lower():
fault = "error"
error = x
print("The type is {} and it says:\n {}".format(fault,error))
elif 'warning' in x.lower():
fault = "warning"
warning = x
print("The type is {} and it says:\n {}".format(fault,warning))