【问题标题】:Calling pandoc from python using subprocess.Popen使用 subprocess.Popen 从 python 调用 pandoc
【发布时间】:2012-09-29 04:28:30
【问题描述】:

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

【问题讨论】:

    标签: python subprocess pandoc


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      subprocess.check_call(args)
      

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

      【讨论】:

        【解决方案3】:

        我不太喜欢使用PIPE,它比较复杂,subprocess 上的 Python 文档建议如果非必要不要使用它(参见 section 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_call 替换为call,但请参阅docs

        如果您想使用引用,请参阅我在 Markx 项目中使用 bibliography 选项的原始实现。

        【讨论】:

          【解决方案4】:

          如果要捕获 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()
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-07-07
            • 2011-10-25
            • 1970-01-01
            • 2013-01-05
            • 1970-01-01
            • 1970-01-01
            • 2012-07-12
            • 2023-04-04
            相关资源
            最近更新 更多