我在使用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]'
这应该可以正常工作,但你可能需要等待它完成,使用的是 subprocess.check_call
而非 subprocess.Popen
直接。
subprocess.check_call(args)
这也确保了它完成了 顺利. 如果状态码不是0,它将抛出一个异常。
我不太喜欢用 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_call
与 call
但见 文件.
如果你想使用引文,请看我的原始实现,从 Markx 项目与 bibliography
选项,如果你想捕获Popen调用产生的stdout和stderr,你需要使用PIPE和community()。
如果你想捕获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()