2009-07-28 7 views
2

Le code suivant se termine par bris de tuyau lorsque canalisé en tee, mais se comportent correctement lorsqu'ils ne sont pas canalisé:stdout python couleur et tee

#!/usr/bin/python 
import sys 
def testfun(): 
    while 1: 
     try : 
      s = sys.stdin.readline() 
     except(KeyboardInterrupt) : 
      print('Ctrl-C pressed') 
      sys.stdout.flush() 
      return 
     print s 

if __name__ == "__main__": 
    testfun() 
    sys.exit() 

Sortie prévue:

./bug.py 
Ctrl-C pressed 

Ce qui est observé lorsque canalisé dans tee est soit un tuyau cassé ou pas de sortie du tout, c.-à-rien sur la sortie standard de départ, et rien dans bug.log:

./bug.py | tee bug.log 
Traceback (most recent call last): 
    File "./bug.py", line 14, in <module> 
    sys.stdout.flush() 
IOError: [Errno 32] Broken pipe 

Quelle peut en être la raison ?

Répondre

3

Lorsque vous appuyez sur Ctrl-C, le shell mettra fin à les deux processus (python et tee) et abattre le tuyau qui les relie. Donc, quand vous manipulez le Ctrl-C dans votre processus python et le vidage, il va trouver que tee a été terminé et le tuyau n'est plus. D'où le message d'erreur.

(En aparté, seriez-vous attendre à quoi que ce soit dans le journal? Je ne vois pas votre processus sortir autre chose que la chasse à la sortie)

+1

Je pense Ctrl-C enfoncé apparaître dans le journal. – shodanex

+0

Bien sûr. Malheureusement, le processus du 'tee' sera probablement passé. Je redirigerais simplement le fichier std de python vers un fichier, puis j'achèverais ce fichier. Ou, selon votre shell, vous pouvez probablement faire quelque chose de spécial pour rediriger et écrire encore sur la console. –

+0

Ah. Juste vu votre entreprise de tuyaux nommés ci-dessous –

5

Ce n'est pas un problème de python, mais un problème de coquille, comme l'a par Brian, appuyer sur Ctrl-C mettra fin aux deux processus. Contournement consiste à utiliser des canaux nommés:

mknod mypipe p 
cat mypipe | tee somefile.log & 
./bug.py > mypipe 
7

Nope, appuyant sur Ctrl-C ne termine pas les deux processus. Il termine seulement le processus de tee, la fin du processus de départ ferme le tuyau entre votre script et tee, et donc votre script meurt avec le message de tuyau cassé.

Pour corriger cela, tee a une option pour passer le Ctrl-C à son processus précédent dans la conduite: -i

essayer: homme tee

./bug.py 
^CCtrl-C pressed 
./bug.py | tee log 
^CTraceback (most recent call last): 
    File "./bug.py", line 14, in <module> 
    testfun() 
    File "./bug.py", line 9, in testfun 
    sys.stdout.flush() 
IOError: [Errno 32] Broken pipe 

./bug.py | tee -i log 
^CCtrl-C pressed 
+0

Cela a résolu le problème pour moi, mais j'ai dû ajouter quelques appels sys.stdout.flush(), qui n'étaient pas nécessaires lorsque vous allez à stdout seulement. –

Questions connexes