2016-09-29 24 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