Seite 1 von 1

subprocess.check_output() und subprocess.CalledProcessError

Verfasst: Freitag 8. Mai 2015, 07:21
von skirnir
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.

Re: subprocess.check_output() und subprocess.CalledProcessEr

Verfasst: Freitag 8. Mai 2015, 07:30
von Sirius3
@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.

Re: subprocess.check_output() und subprocess.CalledProcessEr

Verfasst: Freitag 8. Mai 2015, 08:00
von skirnir
Danke! Ich habe es mal eingebaut.
Mal sehen, wann der Fehler das nächste Mal auftritt...