subprocess.check_output() und subprocess.CalledProcessError

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
skirnir
User
Beiträge: 33
Registriert: Sonntag 25. Januar 2015, 10:59

Hallo zusammen,

ich habe einen Cron-Job, der täglich eine *.odt-Datei generiert und diese mit libreoffice in ein pdf konvertiert. Die pdf-Datei des Vortages wird dabei jeweils überschrieben.
Mein Problem ist, dass das manchmal fehlschlägt und das Log dazu nicht sehr aufschlußreich ist. Der Code zur Konvertierung sieht so aus:

Code: Alles auswählen

try:
    subprocess.check_output(['libreoffice', '--headless', '-convert-to',
            'pdf', '--outdir', target_dir, source])
    logger.info('%s successfully converted to pdf in %s',
                    source, target_dir)
except subprocess.CalledProcessError as e:
    logger.error('pdf conversion failed: %s', e)
    logger.error('output: %s', e.output)
Wenn die Konvertierung fehlschlägt, steht im Log folgendes:

Code: Alles auswählen

2015-05-08 06:40:11,706: [ERROR] converter:28 pdf conversion failed: Command '['libreoffice', '--headless', '-convert-to', 'pdf', '--outdir', u'/path/to/outdir', u'/path/to/source_file.odt']' returned non-zero exit status 1
2015-05-08 06:40:11,706: [ERROR] converter:29 output: 
Benutze ich subprocess.check_output() bzw. subprocess.CalledProcessError falsch oder muss ich mich einfach damit abfinden, dass libreoffice nicht sehr gesprächig ist?
Ein

Code: Alles auswählen

--verbose
Flag scheint es jedenfalls nicht zu geben.

Der Vollständigkeit halber:

Code: Alles auswählen

$ python --version
Python 2.7.3
P.S.: Mir geht es eher darum, ob ich die Doku des subprocess-Moduls richtig verstanden habe, als um die Lösung des konkreten Problems. Lösungsvorschläge dafür nehme ich aber auch gern. Deshalb noch der Hinweis, dass die Rechte sowohl für das Output-Verzeichnis als auch die zu überschreibende Datei auf 777 stehen und der User, unter dem der Cron-Job läuft auch owner der Datei ist.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@skirnir: bei check_output wird nur der Output über STDOUT zurückgeliefert, wenn also libreoffice auf die Error-Ausgabe schreibt, geht das verloren. Ein "stderr=subprocess.STDOUT" beim Aufruf könnte helfen.
skirnir
User
Beiträge: 33
Registriert: Sonntag 25. Januar 2015, 10:59

Danke! Ich habe es mal eingebaut.
Mal sehen, wann der Fehler das nächste Mal auftritt...
Antworten