2016-09-29 23 views
0

上下文:我试图找到一个python包的github存储库。要做到这一点,我是zgrep'ping包归档github网址。它正常工作,直到我限制输出1分的结果:subprocess.check_output(),zgrep和匹配限制

# 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 
+0

'zgrep'是(显然)返回了一个非零退出状态...只是因为命令打印上的东西命令行并不意味着它有0退出状态。运行commmand后立即尝试'echo $?' - 是否为'0'? – mgilson

+0

@mgilson,对不起,我之前没有提及它。是的,如果从控制台启动,它将返回0状态。只有在发生错误时,Grep才会返回状态2(1表示不匹配) – Marat

+0

upd:'grep'对于Python中的'-m1'也可以正常工作 – Marat

回答

0

因此,其原因是:zgrep是一个shell脚本,它只是通过管道gzip和egrep的存档。如果我们限制结果的数量,egrep会终止管道,所以gzip退出并投诉。在一个控制台我们从来没有看到它,但子进程以某种方式捕获这个信号并引发一个异常。

解决办法:写zgrep的迷你版本,不抱怨

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