2016-07-22 3 views
0

Ich habe versucht, Subprozess zu verwenden, um Zeilen aus der Protokolldatei zu extrahieren. Die Absicht ist, die Protokolle zu extrahieren, während ein Programm ausgeführt wird, und einige Zeit zu warten, um alle Protokolle in eine andere Datei zu kopieren.Python, warum dieser Subprozessbefehl nicht wie erwartet funktioniert

#!/bin/python 

import threading 
import time, subprocess 


class GetLogs(threading.Thread): 
    ''' 
     Get the developer logs 
    ''' 
    def __init__(self): 
     ''' 
     init 
     ''' 
     self.stop = False 
     threading.Thread.__init__(self) 
     print "Initialised thread" 

    def run(self): 
     ''' 
      Collect the logs from devlog 
     ''' 
     command = "tail -f /var/log/developer_log | tee /tmp/log_collected" 
     response = subprocess.check_output(command.split(), shell=True) 
     print "Subprocess called"+str(response) 

     while (self.stop is False): 
      time.sleep(1) 
      print "Continuing" 
      continue 

     print "Finished the log file" 


gl = GetLogs() 
gl.start() 

##Do some activity here 
print "Sleeping for 10 sec" 
time.sleep(10) 
gl.strop = True 

print "Done" 

Das funktioniert nicht - Programm bleibt hängen.

+0

können Sie nicht Subprocess so warten – YOU

Antwort

1

subprocess.check_output() wartet auf alle der Ausgang. Es wartet darauf, dass der untergeordnete Prozess seinen STDOUT-Stream beendet oder schließt.

tail -f nie beendet und nie seinen STDOUT-Stream geschlossen. Daher wird keine der Codezeilen unterhalb des Aufrufs von check_output() ausgeführt.

Wie die Warnung über Deadlocks in https://docs.python.org/2/library/subprocess.html suggeriert, schauen Sie sich stattdessen mit Popen() und communicate() an.

+0

Vielen Dank für die Antwort. – user2677279

+0

Ich versuchte es mit Popen. Immer noch das gleiche/ähnliche Problem unten ist mein Code – user2677279