Chiamare Pandoc da Python usando sottoprocess.popen
-
11-12-2019 - |
Domanda
Sto avendo problemi chiamando PandoC da Python utilizzando subprocess.Popen
.Tutto funziona nella console.Ecco il codice.
# Test markdown file
here is just a simple markdown file.
.
Ora il mio codice Python utilizzando quel filename
è il percorso completo del mio file Markdown:
import subprocess
fileout = os.path.splitext(filename)[0] + ".pdf"
args = ['pandoc', filename, '-o', fileout]
subprocess.Popen(args)
.
Ho anche provato vari modi per catturare un errore ma non funzionava.Nella console, tuttavia, tutto funziona bene:
pandoc '[filename]' -o '[fileout]'
. Soluzione
che dovrebbe funzionare bene, ma potresti voler aspettare che finisca usando subprocess.check_call
anziché subprocess.Popen
direttamente:
subprocess.check_call(args)
.
Ciò si assicura che sia completato correttamente .Se il codice di stato non è 0, lancerà un'eccezione.
Altri suggerimenti
Non mi piace molto usare PIPE
, è più complicato, e i documenti Python su subprocess
consigliano di non usarlo se non necessario (vedere Sezione 17.1.1 ).
Questo funziona per me (preso da Markx ).
Nome file è il nome del file di markdown senza .md
e l'estensione nell'uscita desiderata (.pdf
, .docx
):
def pandoc(filename, extension):
# TODO manage pandoc errors, for example exit status 43 when citations include Snigowski et al. 2000
options = ['pandoc', filename + '.md', '-o', filename + extension]
options += ['--ascii', '-s', '--toc'] # some extra options
options += ['--variable=geometry:' + 'a4paper'] # to override the default letter size
print options # for debugging
return subprocess.check_call(options)
.
Se c'è stato un problema un'eccezione in allevata. Se si desidera ottenere il codice di stato invece di un'eccezione, penso che dovresti sostituire check_call
con call
, ma vedere Documenti .
Se si desidera utilizzare citazioni vedere la mia implementazione originale da Markx Progetto con l'opzione bibliography
.
Se si desidera catturare lo stdout e Stderr derivanti dalla chiamata PAPEN, è necessario utilizzare il tubo in combinazione con Comunicare ().
from subprocess import Popen, PIPE
fileout = os.path.splitext(filename)[0] + ".pdf"
args = ['pandoc', filename, '-o', fileout]
stdout, stderr = Popen(args, stdout=PIPE, stderr=PIPE).communicate()
.