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]'
.

È stato utile?

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

Questo non risponde alla tua domanda (e potresti desiderare specificamente / è necessario chiamare Pandoc usando sottocrass.popen) ma c'è un wrapper Python per Pandoc chiamato Pyandoc : guarda la mia risposta qui .

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()
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top