当grep找不到匹配项时,带有grep命令的subprocess.check_output失败

 choojo深呼吸 发布于 2023-02-05 12:32

我正在尝试搜索文本文件并检索包含一组特定单词的行.这是我正在使用的代码:

tyrs = subprocess.check_output('grep "^A" %s | grep TYR' % pocket_location, shell = True).split('\n')

当文件包含grep标识的至少一行时,这可以正常工作.但是当grep没有标识任何行时,grep返回退出状态1并且我收到以下错误:

Traceback (most recent call last):
  File "../../Python_scripts/cbs_wrapper2.py", line 324, in 
    tyrs = subprocess.check_output('grep "^ATOM" %s | grep TYR' % pocket_location, shell = True).split('\n')
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 544, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command 'grep "^ATOM" cbsPrediction_files/1u9c_clean/1u9c_clean_fpocket_out/pockets/pocket0_atm.pdb | grep TYR' returned non-zero exit status 1

我该如何避免这个问题?subprocess.check_output如果grep找不到任何内容,我只想返回一个空字符串.

谢谢

2 个回答
  • tyrs = subprocess.check_output('grep "^A" %s | grep TYR || true' % pocket_location, shell = True).split('\n')
    

    2023-02-05 12:34 回答
  • 我只是希望subprocess.check_output在grep找不到任何内容时返回一个空字符串.

    好吧,太糟糕了.grep认为没有匹配是失败的,并且checkin的重点check_output是检查失败,所以你明确要求以这种方式做事.以下是相关文档:

    如果返回码非零,则会引发CalledProcessError.CalledProcessError对象将具有returncode属性中的返回代码以及output属性中的任何输出.

    并为grep:

    The following exit values shall be returned:
      0 One or more lines were selected.
      1 No lines were selected.
      >1 An error occurred.
    

    因此,如果您希望将"无行"视为成功,将实际错误视为错误,则必须以1不同于其他非零值的方式处理该值.并且check_output不知道你想要那样做.

    所以,要么你必须处理CalledProcessError,要么你必须自己检查.换句话说,要么:

    try:
        tyrs = subprocess.check_output('grep "^A" %s | grep TYR' % pocket_location, shell = True).split('\n')
    except subprocess.CalledProcessError as e:
        if e.returncode > 1:
            raise
        tyrs = []
    

    … 或这个:

    p = subprocess.Popen('grep "^A" %s | grep TYR' % pocket_location, shell=True,
                         stdout=subprocess.PIPE)
    output, _ = p.communicate()
    if p.returncode == 1: # no matches found 
        tyrs = []
    elif p.returncode == 0: # matches found
        tyrs = output.split('\n')
    else:
        # error, do something with it
    

    2023-02-05 12:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有