【问题标题】:subprocess.check_output(), zgrep, and match limitsubprocess.check_output()、zgrep 和匹配限制
【发布时间】:2017-02-08 04:15:07
【问题描述】:

上下文:我正在尝试查找 python 包的 github 存储库。为此,我是 github url 的 zgrep'ping 包存档。它工作正常,直到我将输出限制为 1 个结果:

# works, returns a lot of results
subprocess.check_output(["zgrep", "-oha", "github", 'Django-1.10.1.tgz'])  #  works, a lot of results
# add -m1 to limit output, returns status 2 (doesn't work)
subprocess.check_output(["zgrep", "-m1", "-oha", "github", 'Django-1.10.1.tgz'])  #  works, a lot of results
# same command, different file - works
subprocess.check_output(["zgrep", "-m1", "-oha", "github", 'grabber.py'])

从命令行,所有三个命令都可以正常工作。有什么想法吗?

追溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/subprocess.py", line 574, in check_output
    raise CalledProcessError(retcode, cmd, output=output)
subprocess.CalledProcessError: Command '['zgrep', '-m1', '-oha', 'github', 'pkgs/Django-1.10.1.tar.gz']' returned non-zero exit status 2

命令行:

$ zgrep -m1 -oha "github.com/[^/]\+/django" pkgs/Django-1.10.1.tar.gz
github.com/django/django

【问题讨论】:

  • zgrep (显然)为那个返回非零退出状态...仅仅因为命令在命令行上打印内容并不意味着它具有 0 退出状态。运行命令后立即尝试echo $? -- 是0吗?
  • @mgilson,抱歉我之前没有提到。是的,如果从控制台启动,它会返回 0 状态。仅当发生错误时,Grep 才会返回状态 2(1 表示不匹配)
  • upd: grep 也适用于 Python 中的 -m1

标签: python bash subprocess zgrep


【解决方案1】:

所以,原因是:zgrep 是一个 shell 脚本,它简单地通过 gzip 和 egrep 管道存档。如果我们限制结果的数量,egrep 会终止管道,因此 gzip 会退出并抱怨。在控制台中我们永远看不到它,但是子进程以某种方式捕获了这个信号并引发了异常。

解决方案:编写不会报错的迷你版zgrep

gunzip < $FILE 2> /dev/null | egrep -m1 -ohia $PATTERN

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    相关资源
    最近更新 更多