python - 如何在 python 中对子进程使用错误处理
问题描述
我在 postgres 中有这张表:
remote-as IRR-record
+==========+=====================================+
12564 + MAIyNT-AS38082 +
+==========+=====================================+
32934 + AS-FACEBOOK +
+==========+=====================================+
我想遍历这个表并执行一个命令!如果命令失败,我想使用第二个命令
for row in c: #this will iterate through the table
try:
res = subprocess.Popen('bgpq3 -4 {} -m 24 -l {}'.format(row[5],row[2]), shell=True, universal_newlines=True,
stdout=subprocess.PIPE).communicate()[0]
except Exception:
print("error detected")
res = subprocess.Popen('bgpq3 -4 AS{} -m 24 -l {}'.format(row[2],row[2]), shell=True, universal_newlines=True,
stdout=subprocess.PIPE).communicate()[0]
在某些情况下,第一个命令会导致错误,因此必须应用第二个命令!
如果没有发生错误,结果是:
ip prefix-list 38082 permit 223.27.237.0/24
ip prefix-list 38082 permit 223.27.240.0/24
ip prefix-list 38082 permit 223.27.241.0/24
错误的结果是:
ERROR:Unable to parse prefix 'MAIyNT-AS38082', af=2 (inet), ret=0
ERROR:Unable to parse prefix MAIyNT-AS38082
ERROR:Unable to add prefix MAIyNT-AS38082 (bad prefix or address-family)
这种情况下的错误不能轻易检测到!!
任何想法?或者也许我不必使用 try 并且在这种情况下除外?我已经尝试过几乎所有类型的错误处理!像Except, except as, OsError 等等!!
请注意,我可以通过 stderr 打印错误!如果标准输出的结果很好,我想执行第一个命令!!
解决方案
您无法“捕获”异常,因为subprocess.Popen
没有引发。
如果您的所有错误消息(返回的错误消息bgpq3
)都以“ERROR:”前缀开头,您可以尝试下面的代码。
for row in c:
try:
res = subprocess.Popen('bgpq3 -4 {} -m 24 -l {}'.format(row[5],row[2]), shell=True, universal_newlines=True,
stdout=subprocess.PIPE).communicate()[0]
if res.startswith("ERROR:"):
res = subprocess.Popen('bgpq3 -4 AS{} -m 24 -l {}'.format(row[2],row[2]), shell=True, universal_newlines=True,
stdout=subprocess.PIPE).communicate()[0]
print(res)
except Exception:
print("Exception Detected for %s", row[2])
推荐阅读
- elasticsearch - 如何保护 ElasticSearch 中的数据
- regex - 正则表达式匹配第一个字符和文件扩展名
- ios - 如何解决 PhotoKit 错误“原始资源选择仅对未调整的基础版本有效”?
- python-3.x - ModuleNotFoundError:python 中没有名为“flask_wtf”的模块
- c# - 需要从 Gridview 中选择一行并运行显示结果的选择查询
- python-3.x - 查找列表元素和数据框列之间的最长匹配
- hibernate - 参数未在 Spring Boot 中的 JPA @query 中传递
- typescript - 通用对象返回类型是方法链接的结果
- java - Java if 语句问题
- android - 如何防止自定义DialogFragment在显示时隐藏键盘