Python中的错误和警告处理

Python中的错误和警告处理,python,bash,popen,Python,Bash,Popen,我正在尝试创建一个脚本来处理来自其他脚本的错误和警告,它可以是其他python或bash脚本 我发现实现这一点的唯一方法是使用Popen,使用Popen执行脚本并将stderr存储到变量中 检查Popen的returncode,我可以说stderr是一个警告(returncode 0,脚本成功运行)还是一个错误(returncode 1,脚本没有成功运行) 但是,有些脚本即使出错,也会继续执行命令,因此返回代码为0,就像出现了一些警告或脚本成功运行一样。我怎么处理这种事情 以下是一些可以全面了解

我正在尝试创建一个脚本来处理来自其他脚本的错误和警告,它可以是其他python或bash脚本

我发现实现这一点的唯一方法是使用Popen,使用Popen执行脚本并将stderr存储到变量中

检查Popen的returncode,我可以说stderr是一个警告(returncode 0,脚本成功运行)还是一个错误(returncode 1,脚本没有成功运行)

但是,有些脚本即使出错,也会继续执行命令,因此返回代码为0,就像出现了一些警告或脚本成功运行一样。我怎么处理这种事情

以下是一些可以全面了解的示例:

sshpass -p password sftp -q username@host << EOF
cd Export
get file.csv
EOF
这个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命令返回0,而它应该返回对应于错误的1?

我建议您在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))

我建议您在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))

为什么要使用命令行
ssh
?使用Python SSH库。这只是一个bash脚本的示例,它给了我一个意外的返回代码。我的脚本的目标是运行pyhton和bash脚本。我可以在新脚本中使用Python SSH,但我不能将服务器上的每个脚本都更改为使用Python,明白吗?很好,那么我将删除标记,因为您的问题不是关于SFTP的。为什么要使用命令行
SSH
?使用Python SSH库。这只是一个bash脚本的示例,它给了我一个意外的返回代码。我的脚本的目标是运行pyhton和bash脚本。我可以在新脚本中使用Python SSH,但我不能将服务器上的每个脚本都更改为使用Python,明白吗?很好,那么我将删除标记,因为您的问题与SFTP无关。谢谢您的帮助,我将尝试按照您的建议通过bash实现日志记录,看看它是否能完成任务。@MarcusVinícius好的,让我知道您是否遇到任何错误谢谢帮助,我将尝试按照您的建议通过bash实现日志记录,看看它是否能完成任务。@MarcusVinícius好的,让我知道您是否遇到任何错误