使用subprocess.Popen从python中调用pandoc。

问题描述 投票:3回答:4

我在使用python调用pandoc时遇到了一些问题。subprocess.Popen. 这一切都在控制台工作。这里是代码。

# Test markdown file
here is just a simple markdown file.

现在我的python代码使用的是 filename 是我的markdown文件的完整路径。

import subprocess
fileout = os.path.splitext(filename)[0] + ".pdf"
args = ['pandoc', filename, '-o', fileout]
subprocess.Popen(args)

我也尝试了各种方法来捕捉错误 但都没有用。然而,在控制台中,一切运行正常。

pandoc '[filename]' -o '[fileout]'
python subprocess pandoc
4个回答
3
投票

这应该可以正常工作,但你可能需要等待它完成,使用的是 subprocess.check_call 而非 subprocess.Popen 直接。

subprocess.check_call(args)

这也确保了它完成了 顺利. 如果状态码不是0,它将抛出一个异常。


5
投票

这并不能回答你的问题 (你可能特别需要使用subprocess.Popen来调用pandoc),但是有一个Pandoc的Python封装器,叫做 Pyandoc:见我的答复 此处.


2
投票

我不太喜欢用 PIPE复杂一些,而且Python文档中关于 subprocess 如果没有必要,建议不要使用(见 第17.1.1节).

这对我来说是有效的(取自 Markx).

文件名是标记文件的名称,不包括 .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_callcall但见 文件.

如果你想使用引文,请看我的原始实现,从 Markx 项目与 bibliography 选项,如果你想捕获Popen调用产生的stdout和stderr,你需要使用PIPE和community()。


1
投票

如果你想捕获Popen调用产生的stdout和stderr,你需要使用PIPE和community()。

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()
© www.soinside.com 2019 - 2024. All rights reserved.