2017-03-24 3 views
0

In meinem Python/Django-Code rufe ich gdalbuildvrt Prozess. Dieser Prozess sollte eine .VRT-Datei erstellen, tut dies jedoch nicht. Um es zu überprüfen, schreibe ich die Subprozessausgabe in eine Debug-Datei. Dies ist, wie ich es tun:Wie debuggen Subprozess Aufruf in Python/Django

process = subprocess.Popen(["gdalbuildvrt", mosaic, folder], stdout=subprocess.PIPE) 
stdout = process.communicate()[0] 

with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "debug.txt"), 'w') as file: 
    file.write('{}'.format(stdout) + " -> " + mosaic) 

Als Folge ich dies in debug.txt Datei sehen:

b'0...10...20...30...40...50...60...70...80...90...100 - done.\n' -> /var/www/vwrapper/accent/accent/layers/raw/mosaic.vrt 

So, wie Sie den ersten Teil der Debug-Anweisung sagt sehen können, dass es‘ ok:

0...10...20...30...40...50...60...70...80...90...100 - done. 

Und der zweite Teil sagt, dass /var/www/vwrapper/accent/accent/layers/raw/mosaic.vrt erstellt werden soll. Wenn ich jedoch in den Zielordner gehe und ihn aktualisiere, sehe ich dort keine Datei mosaic.vrt. Also, was kann daran falsch sein und wie kann ich es beheben? Ich sollte hinzufügen, dass es auf Windows-Rechner 100% ok ist, aber auf CentOS tut es nicht.

+0

Log 'stderr' und der' .returncode' ... das ist, wo keine Probleme geben wird. – TemporalWolf

+0

@TemporalWolf. Würdest du so ein bisschen näher darauf eingehen? Sie können eine vollständige Antwort geben, wenn Sie es wünschen. – Jacobian

Antwort

1
process = subprocess.Popen(["gdalbuildvrt", mosaic, folder], 
          stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
stdout, stderr = process.communicate() 
ret = process.returncode 

oder

process = subprocess.Popen(["gdalbuildvrt", mosaic, folder], 
          stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 

die stderr zu stdout umleitet.

Dann diese beiden Dinge log:

Alle Fehlerprotokollierung auf stderr sein sollte, nicht stdout. Und jeder Rückkehrcode erscheint über process.returncode.

Sie könnten wahrscheinlich eine der höheren Prozesse auch verwenden, wie subprocess.check_call()

+0

Danke! Ich habe es gerade überprüft. stderr erhält keinen Wert und ret erhält 0 Wert. Es scheint, als ob es keine Fehler gibt, aber immer noch nicht, was es tun soll. Ich frage mich wirklich, was könnte falsch sein. – Jacobian

+1

@Jacobian Ich habe eine Bearbeitung gemacht. Sie müssen sicherstellen, dass Sie eine Pipe für 'stderr' hinzufügen oder umleiten zu' stdout' – TemporalWolf

+1

Fantastisch! Jetzt sehe ich wo der Fehler war. Ich danke dir sehr! – Jacobian