2016-09-29 2 views
0

컨텍스트 : 파이썬 패키지의 github 저장소를 찾으려고합니다. 그렇게하기 위해, 나는 github URL을위한 패키지 아카이브를 zgrep'ping하고있다. 그리고 출력 결과를 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'는 (분명히)는 불평하지 않습니다하려면 zgrep의 미니 버전을 쓰기 명령 행에서 종료 상태가 0임을 의미하지는 않습니다. 명령을 실행 한 직후'echo $?'를 시도해보십시오 -'0'입니까? – mgilson

+0

@mgilson, 죄송합니다. 전에 언급하지 않았습니다. 예, 콘솔에서 실행하면 0 상태를 반환합니다. Grep은 어떤 에러가 발생했을 때만 상태 2를 반환 할 것입니다 (1은 일치하지 않음을 의미합니다) – Marat

+0

upd :'grep' 또한 파이썬에서'-m1'과 함께 잘 작동합니다 – Marat

답변

0

그래서, 그 이유는 다음과 같습니다하려면 zgrep는 쉘 스크립트 인 단순히 파이프 GZIP 및 egrep을 통해 아카이브를. 결과의 수를 제한하면 egrep은 파이프를 종료하므로 gzip이 종료되고 불만이 제기됩니다. 콘솔에서는 결코 그것을 볼 수 없지만, 서브 프로세스는 어떻게 든이 신호를 잡아 예외를 발생시킵니다.

해결 방법 : 명령 인쇄에 물건을해서 ... 그 일에 대해 0이 아닌 종료 상태를 반환

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