寻求可执行Python代码块并将其输出视为Markdown的Pandoc过滤器
寻求可执行Python代码块并将其输出视为Markdown的Pandoc过滤器
嗨,你要的这种功能完全可以实现,既有现成的第三方工具可用,也能自己快速写个简单的过滤器,下面给你详细说说:
一、现成工具:pandoc-run-code
这个第三方过滤器专门用来执行代码块并将输出替换原代码块,支持Python在内的多种编程语言,用起来很省心:
- 先通过pip安装它:
pip install pandoc-run-code
- 在你的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数据接口来处理文档:
- 新建一个名为
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()
- 给脚本添加执行权限:
chmod +x pyscript.py
- 运行Pandoc时使用这个自定义过滤器:
pandoc --filter ./pyscript.py file.md -o file.html
这个简易版本能满足你的核心需求,如果需要更复杂的功能(比如同时保留原代码块和输出、处理多行输出为多个段落等),可以再扩展脚本的逻辑。
⚠️ 注意:执行未知来源的Python代码存在安全风险,务必只在你自己可控的文档上使用这类过滤器哦!
备注:内容来源于stack exchange,提问作者Scott Deerwester
相关产品推荐
相关产品推荐

