2016-05-31 9 views
0

Ich habe derzeit ein Problem bei der Verwendung von zwei Teilprozesse (ich werde mehr hinzufügen, wenn ich das behoben) in eine Datei zu drucken. Ich bekomme die Summe von awk und jetzt versuche ich es in eine Datei zu drucken und es wird nicht richtig gedruckt. Ich benutze Python 2.6 und es gibt keine Möglichkeit zu aktualisieren. Ich schließe meine Dateien auch am Ende meines Programms, das ist also nicht das Problem. edit: Der Zweck dieses Codes besteht darin, Dateien durchzulaufen und die Häufigkeit zu zählen, mit der eine bestimmte Zeichenfolge angezeigt wird. Legen Sie sie in Dateien und summieren Sie dann die Dateien in einer endgültigen Ausgabedatei.Mehrere Unterprozesse Drucken in Datei

def serv2Process(HOST = "testServer.com"): 
     encInTotal1 = 0 
     signInTotal1 = 0 
     p = subprocess.Popen(["ssh", "%s" % HOST, COMMAND], 
      shell = False, 
      stdout = subprocess.PIPE, 
      close_fds = True) 
     for line in p.stdout: 
      if 'String to search'.lower() in line.lower(): 
       totalCount1 = totalCount1 +1 
      if 'String 2 to search'.lower() in line.lower(): 
       totalCount2 = totalCount2 +1 
     file1.write("%s\n" %totalCount1) 
     file2.write("%s\n" %totalCount2) 

     sys.stdout.flush() 

    p1 =threading.Thread(target = serv1Process, args=(HOST1,), name = 'serv1Process') 
    p2=threading.Thread(target = serv2Process, args= (HOST2,), name = 'serv2Process') 
    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 
    with open("SomeScriptName.%s" % strDateForm, 'w+')as search_file: 
     search_file.write("Header: ") 
     sys.stdout.flush() 
     proc = subprocess.Popen(['awk', '{sum+=$1} END {print sum}',"file1.%s" %strDateForm], shell=False, stdout=search_file,close_fds = True) 
     proc.wait() 

     search_file.write("\n") 
     search_file.write("Header2: ") 
     search_file.flush() 
     proc2 = subprocess.Popen(['awk', '{s+=$1} END {print s}',"file2.%s" %strDateForm], shell=False, stdout=search_file,close_fds = True) 
     proc2.wait() 
    file1.close() 
    file2.close() 

Antwort

0

Sie müssen sicherstellen, dass Sie nicht gleichzeitig mit dem gestarteten Prozess in die Datei schreiben. Um dies zu tun, müssen Sie die Datei vor dem Start eines Prozesses leeren und warten, bis der Prozess beendet ist, bevor Sie erneut darauf schreiben.

with open("SomeFileName.%s" % strDateForm, 'w+') as search_file: 

    search_file.write("header: ") 
    search_file.flush() 

    proc = subprocess.Popen(['awk', '{sum+=$1} END {print sum}',"AnotherFileName" ], shell=False, stdout=search_file,stderr = subprocess.PIPE,close_fds = True) 
    proc.wait() 

    search_file.write("Header 2: ") 
    search_file.flush() 

    proc2 = subprocess.Popen(['awk', '{s+=$1} END {print s}',"AThirdFileName"], shell=False, stdout=search_file,stderr = subprocess.PIPE,close_fds = True) 
    proc2.wait() 

auch umleiten Sie stderr an einem Rohr, aber man kann nie von ihr lesen. Wenn der Subprozess genug Ausgabe auf stderr erzeugt, um den Pipe-Puffer zu füllen, wird er blockiert. Wenn Sie nicht an stderr interessiert sind, leiten Sie es nicht um, damit es zum Terminal geht, oder leiten Sie es an /dev/null um.

Und Sie versuchen, sys.stdout zu leeren, aber das wird nicht wirklich etwas in Bezug auf diesen Code auswirken.


edit: nach dem aktualisierten Code zu sehen, einige Bemerkungen:

  • die geöffneten Dateien file1 und file2 vorausgesetzt, die Dateien sind die awk Subprozesse zu lesen versuchen: stellen Sie sicher, sie zu spülen oder schließen vor Starten von Prozessen.
  • Sie rufen sys.stdout.flush() mehrere Male, aber es hat keinen Sinn, das zu tun. Du schreibst nicht wirklich in sys.stdoutd, also macht das Löschen nichts. Spülen file1, file2 und search_file stattdessen!
  • Wenn dies nicht Code für die Ausübung der Verwendung des subprocess-Moduls ist, sollten Sie wahrscheinlich in Betracht ziehen, Python direkt zu verwenden, um die Zahlen aus der Datei zusammenzufassen, anstatt auf awk zu schälen.
+0

Dies nur gedruckt die Header auf die Dateien, nicht das Ergebnis der Prozesse. – cvirus96

+0

Sind Sie sicher, dass Ihr awk-Programm eine Ausgabe erzeugt? Versuchen Sie, die 'stderr'-Umleitung zu entfernen, wie ich vorgeschlagen habe, vielleicht erhalten Sie stattdessen einige Fehler durch den awk-Prozess. – mata

+0

Ja. Wenn ich das mit einem Ausgang starte, funktioniert es einwandfrei. Aber sobald ich einen anderen Subprozess hineinwerfe funktioniert es nicht – cvirus96