【问题标题】:Error and Warning Handling in PythonPython 中的错误和警告处理
【发布时间】:2017-07-10 14:35:04
【问题描述】:

我正在尝试制作一个脚本来处理来自其他脚本的错误和警告,它可以是其他 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 对应一个错误?

【问题讨论】:

  • 你为什么使用命令行ssh?使用 Python SSH 库。
  • 这只是一个 bash 脚本示例,它给了我一个意外的返回码。我的脚本的目标是运行 pyhton 和 bash 脚本。我可以在新脚本中使用 Python SSH,但我不能将服务器上的每个脚本都更改为使用 Python,明白吗?
  • 好,那么我将删除 sftp 标签,因为您的问题与 SFTP 无关。

标签: python bash popen


【解决方案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 实现日志记录,看看是否可以完成工作。
  • @MarcusVinícius 好吧,让我知道您是否遇到任何错误
猜你喜欢
  • 2012-09-09
  • 2015-02-16
  • 1970-01-01
  • 2017-10-24
  • 2013-10-26
  • 2018-08-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多