如何在单个Quarto网站中配置多个Python虚拟环境?
我想要创建一个包含所有Quarto演示文稿的网站,于是搭建了一个Quarto网站并将所有演示文稿移入子文件夹,通过iframe将这些演示文稿嵌入主网站的index.qmd表格中。目录结构如下:
presentations │ ├── _quarto.yml │ ├── _site │ ├── index.qmd │ ├── styles.css │ ├── presentation_1 │ │ ├── Pipfile │ │ ├── Pipfile.lock │ │ ├── presentation_1.qmd │ ├── presentation_2 │ │ ├── Pipfile │ │ ├── Pipfile.lock │ │ ├── presentation_2.qmd ...
但渲染整个网站时发现,各演示文稿使用独立的Python虚拟环境(我使用pipenv,如上所示的Pipfile)。目前需进入每个演示子目录,激活对应虚拟环境后单独渲染该目录内容,最后再激活全局环境渲染整个网站。请问是否有更便捷的方法?能否为每个qmd文件单独指定虚拟环境?我不想将所有依赖移入全局环境,避免依赖冲突。
1. 为单个QMD文件指定Python解释器路径
Quarto支持在QMD文件的YAML头部直接指定Python解释器,你可以把每个演示文稿对应的Pipenv虚拟环境的Python路径写进去,渲染时Quarto会自动调用该环境:
在每个presentation_x.qmd的开头添加:
--- title: "你的演示文稿标题" execute: python: "/path/to/your/presentation_x/.venv/bin/python" ---
注意:在对应演示子目录下执行pipenv --venv可获取虚拟环境路径,在该路径后拼接/bin/python就是完整的解释器路径
2. 编写批量渲染脚本
如果演示文稿数量较多,可编写shell脚本(Linux/macOS)或批处理脚本(Windows)自动完成所有渲染操作:
示例shell脚本(保存为render_all.sh):
#!/bin/bash # 遍历所有演示子目录并渲染 for dir in presentation_*/; do echo "开始渲染 $dir..." cd "$dir" pipenv run quarto render cd .. done # 渲染主网站 quarto render
给脚本添加执行权限:chmod +x render_all.sh,之后直接运行./render_all.sh即可完成全部渲染流程。
3. 在主网站配置中定义子项目渲染规则
在根目录的_quarto.yml中添加子项目配置,指定每个演示文稿的渲染命令,之后直接运行根目录的quarto render即可自动完成所有子项目和主网站的渲染:
project: type: website subprojects: - path: presentation_1 render: "pipenv run quarto render" - path: presentation_2 render: "pipenv run quarto render" # 按需添加其他演示文稿目录
内容的提问来源于stack exchange,提问作者asmaier

