Вызов pandoc из Python с использованием subprocess.Popen
-
11-12-2019 - |
Вопрос
У меня проблемы с вызовом pandoc из Python, используя subprocess.Popen
.Все работает в консоли.Вот код.
# Test markdown file
here is just a simple markdown file.
Теперь мой код Python использует это filename
это полный путь к моему файлу уценки:
import subprocess
fileout = os.path.splitext(filename)[0] + ".pdf"
args = ['pandoc', filename, '-o', fileout]
subprocess.Popen(args)
Я также пробовал разные способы обнаружить ошибку, но это не сработало.Однако в консоли все работает нормально:
pandoc '[filename]' -o '[fileout]'
Решение
Это должно работать нормально, но вы можете подождать, пока все закончится, используя subprocess.check_call
скорее, чем subprocess.Popen
напрямую:
subprocess.check_call(args)
Это также гарантирует, что оно завершено успешно.Если код состояния не равен 0, будет выдано исключение.
Другие советы
Мне не очень нравится использовать PIPE
, это сложнее, и документация Python на subprocess
рекомендуем не использовать его без необходимости (см. раздел 17.1.1).
У меня это работает (взято из Маркс).
Имя файла — это имя файла уценки без .md
, и расширение в желаемом выводе (.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)
Если возникла проблема, возникло исключение.Если вы хотите получить код состояния вместо исключения, я думаю, вам следует заменить check_call
с call
, но см. документы.
Если вы хотите использовать цитаты, посмотрите мою оригинальную реализацию из Маркс проект с bibliography
вариант.
Если вы хотите захватить STDOUT и STDERR, что приведет к тому, что вызов POPON вам нужно будет использовать трубу в сочетании с Comment ().
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()
.