2016-09-29 2 views
0

コンテキスト:私はpythonパッケージの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']) 

コマンドラインから、3つのコマンドはすべて正常に動作します。何か案は?

トレースバック:

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'もPythonの' -m1'でうまく動作します – Marat

答えて

0

、その理由は次のとおりです。zgrepはgzipとegrepを通じた単純パイプアーカイブ、シェルスクリプトです。結果の数を制限すると、egrepはパイプを終了するので、gzipは終了し、苦情を受けます。コンソールでは決してそれを見ませんが、サブプロセスは何とかこのシグナルを受け取り、例外を発生させます。

対処:コマンドプリントは上詰めるという理由だけで...その1のために、ゼロ以外の終了状態を返す

gunzip < $FILE 2> /dev/null | egrep -m1 -ohia $PATTERN 
関連する問題