使用subprocess.Popen从python调用pandoc

时间:2012-09-29 04:28:30

标签: python subprocess pandoc

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

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

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

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

我还尝试了各种方法来捕获错误但是没有用。但是,在控制台中,一切运行正常:

pandoc '[filename]' -o '[fileout]'

4 个答案:

答案 0 :(得分:5)

这不能回答你的问题(你可能特别希望/需要使用subprocess.Popen调用pandoc)但是有一个名为Pyandoc的Pandoc的Python包装器:请参阅我的回答here

答案 1 :(得分:3)

这应该可以正常工作,但您可能需要等待它直接使用subprocess.check_call而不是subprocess.Popen

subprocess.check_call(args)

这也确保它已成功完成 。如果状态代码不为0,则会抛出异常。

答案 2 :(得分:1)

如果你想捕获Popen调用产生的stdout和stderr,你需要将PIPE与communic()结合使用。

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

答案 3 :(得分:1)

我真的不喜欢使用PIPE,它更复杂,subprocess上的Python文档建议不要在没有必要的情况下使用它(请参阅section 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_call替换为call,但请参阅docs

如果您想使用引文,请使用bibliography选项查看Markx项目中的原始实现。