You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

寻求可执行Python代码块并将其输出视为Markdown的Pandoc过滤器

寻求可执行Python代码块并将其输出视为Markdown的Pandoc过滤器

嗨,你要的这种功能完全可以实现,既有现成的第三方工具可用,也能自己快速写个简单的过滤器,下面给你详细说说:

一、现成工具:pandoc-run-code

这个第三方过滤器专门用来执行代码块并将输出替换原代码块,支持Python在内的多种编程语言,用起来很省心:

  1. 先通过pip安装它:
pip install pandoc-run-code
  1. 在你的Markdown文档里,给Python代码块加上{.pyscript}类(或者默认的{.python run},也可以通过配置自定义识别的类名):
# Heading

```{.pyscript}
import datetime
print(f"The current date and time are {str(datetime.now())}.")
3. 运行Pandoc时指定这个过滤器即可:
```bash
pandoc --filter pandoc-run-code file.md -o file.html

它会自动执行标记的代码块,把输出内容替换掉原代码块,之后Pandoc就会把这段输出当成普通Markdown来处理啦。

二、手动编写简易过滤器

如果不想依赖第三方工具,自己写个Python脚本当过滤器也很简单,核心是利用Pandoc的JSON数据接口来处理文档:

  1. 新建一个名为pyscript.py的文件,写入以下代码:
import sys
import json
import subprocess

def process_pandoc_input():
    # 读取Pandoc传入的JSON格式文档
    document = json.load(sys.stdin)
    updated_blocks = []
    
    for block in document["blocks"]:
        # 识别代码块元素
        if block["t"] == "CodeBlock":
            code_classes = block["c"][0][1]
            # 检查是否是标记为pyscript的代码块
            if "pyscript" in code_classes:
                code_content = block["c"][1]
                # 执行Python代码并捕获输出
                exec_result = subprocess.run(
                    ["python3", "-c", code_content],
                    capture_output=True,
                    text=True
                )
                # 处理标准输出,转换成Pandoc支持的段落元素
                stdout_output = exec_result.stdout.strip()
                if stdout_output:
                    updated_blocks.append({
                        "t": "Para",
                        "c": [{"t": "Str", "c": stdout_output}]
                    })
                # 可选:处理错误输出,添加到文档中
                stderr_output = exec_result.stderr.strip()
                if stderr_output:
                    updated_blocks.append({
                        "t": "Para",
                        "c": [{"t": "Str", "c": f"执行错误:{stderr_output}"}]
                    })
            else:
                # 非目标代码块,原样保留
                updated_blocks.append(block)
        else:
            # 非代码块元素,原样保留
            updated_blocks.append(block)
    
    # 更新文档的块元素
    document["blocks"] = updated_blocks
    # 输出处理后的JSON给Pandoc
    json.dump(document, sys.stdout)

if __name__ == "__main__":
    process_pandoc_input()
  1. 给脚本添加执行权限:
chmod +x pyscript.py
  1. 运行Pandoc时使用这个自定义过滤器:
pandoc --filter ./pyscript.py file.md -o file.html

这个简易版本能满足你的核心需求,如果需要更复杂的功能(比如同时保留原代码块和输出、处理多行输出为多个段落等),可以再扩展脚本的逻辑。

⚠️ 注意:执行未知来源的Python代码存在安全风险,务必只在你自己可控的文档上使用这类过滤器哦!

备注:内容来源于stack exchange,提问作者Scott Deerwester

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:15:29