Вопрос

У меня проблемы с вызовом 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, будет выдано исключение.

Другие советы

Это не отвечает на ваш вопрос (и вы можете конкретно хотеть / нужно позвонить Pandoc, используя SubProcess.POPEN), но есть обертка Python для Pandoc, называется pyandoc : см. Мой ответ здесь .

Мне не очень нравится использовать 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()
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top