6

我在使用 python 从 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]'
4

4 回答 4

5

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

于 2012-12-04T16:29:43.847 回答
3

这应该可以正常工作,但您可能希望等待它完成使用subprocess.check_call而不是subprocess.Popen直接使用:

subprocess.check_call(args)

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

于 2012-09-29T04:41:45.260 回答
3

我真的不喜欢使用PIPE,它更复杂,并且 Python 文档上的 Python 文档subprocess建议在没有必要的情况下不要使用它(请参阅第 17.1.1 节)。

这对我有用(取自Markx)。

Filename 是 Markdown 文件的名称,不带.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选项。

于 2012-12-25T07:00:11.233 回答
1

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

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()
于 2012-09-29T05:39:16.723 回答