2016-09-29 2 views
0

Contexte: J'essaie de trouver un dépôt github d'un paquet python. Pour ce faire, je zgrep'ping archive de paquets pour les urls github. Et cela fonctionne bien jusqu'à ce que je limite la sortie de 1 résultat:subprocess.check_output(), zgrep et limite de correspondance

# 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']) 

Depuis la ligne de commande, les trois commandes fonctionnent bien. Des idées?

Traceback:

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 

Ligne de commande:

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

'zgrep' est (apparemment) le retour d'un état de sortie non nulle pour que l'on ... Tout simplement parce que les impressions de commande choses sur la ligne de commande ne signifie pas qu'il a un statut de sortie 0. Essayez 'echo $?' Immédiatement après avoir exécuté la commande - Est-ce '0'? – mgilson

+0

@mgilson, désolé je ne l'ai pas mentionné auparavant. Oui, il renvoie 0 statut s'il est lancé à partir de la console. Grep renverra le statut 2 seulement si une erreur s'est produite (1 signifie aucune correspondance) – Marat

+0

upd: 'grep' fonctionne aussi bien avec' -m1' de Python – Marat

Répondre

0

Ainsi, la raison est: zgrep est un script shell, qui se contente de tuyaux l'archive gzip et egrep. Si nous limitons le nombre de résultats, egrep termine le tuyau, donc les sorties et les plaintes gzip. Dans une console, nous ne le voyons jamais, mais un sous-processus attrape ce signal et déclenche une exception.

Solution: écrire mini-version de zgrep qui ne se plaint pas

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