【问题标题】:How to catch bash script error, which is run through a python script?如何捕获通过 python 脚本运行的 bash 脚本错误?
【发布时间】:2020-02-21 15:16:26
【问题描述】:

我正在使用 Airflow,并且我有一些 python 脚本,其中一个启动 sh 脚本(1 个或多个)。对于airflow,即使这个bash脚本返回错误,它也认为任务是成功的。

我想在我的 python 脚本中返回 bash 错误,因为气流会注意到。

import glob
import os
from os import path
import subprocess

odsPath = '/apps/data/02_OS/'


for odsFolder in os.listdir(odsPath):
    if(odsFolder in fileNames):
        newPath = odsPath+odsFolder
        print('Script path: ', newPath)
        for foldFiles in os.listdir(newPath):
            if(foldFiles.endswith('sh')):
                print('Sh script can be launch: ', foldFiles)
            if(foldFiles.startswith('run') and foldFiles.endswith('.sh')):
                os.system('sh ' + newPath+'/'+foldFiles)
                print('Script: '+foldFiles+' executed')

在这种情况下,存在 bash 错误,例如“参数数量不正确”

感谢您的帮助:)

【问题讨论】:

标签: python bash airflow


【解决方案1】:

os.system() 运行一个完全不受 Python 控制的命令,但您可以检查它的返回码,如果出现故障,raise 会报错。正如os.system 文档中所建议的那样,subprocess:

subprocess.run(['sh', os.path.join(newPath,foldFiles)],
    check=True)

如果子进程失败,check=True 会引发 subprocess.CalledProcessError。进一步看Running Bash commands in Python

【讨论】:

  • 感谢您的链接它的帮助!现在它工作正常,气流现在捕获错误并显示它。我要检查完整的子流程的文档! :)
  • 如果这解决了您的问题,请考虑投票和/或接受它;另见help.
猜你喜欢
  • 2017-01-11
  • 2016-10-01
  • 1970-01-01
  • 2021-03-20
  • 2011-01-23
  • 1970-01-01
  • 2011-12-16
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多