我在使用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]'
答案 0 :(得分:5)
答案 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项目中的原始实现。