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

如何在Python中正确调用带导入的jsonnet并配置目录结构?

解决方法

首先,先确认你已经装好了Python的Jsonnet绑定,没装的话先跑这个命令:

pip install jsonnet

接下来咱们一步步来实现你要的功能:

1. 读取Jsonnet文件内容到代码片段

因为_jsonnet.evaluate_snippet()是处理代码片段的,不是直接读文件路径,所以在foo.py里得先把jsonnet/bar.jsonnet的内容读出来:

import _jsonnet

# 读取bar.jsonnet的内容
with open("jsonnet/bar.jsonnet", "r") as f:
    bar_code = f.read()

2. 配置导入搜索路径让Jsonnet找到依赖文件

关键就在这里——调用evaluate_snippet()的时候,通过import_paths参数指定jsonnet/目录。这样不管是你读取的代码片段,还是片段里导入的其他文件,Jsonnet解析器都能在这个目录里找到它们:

# 执行Jsonnet代码并得到JSON结果
json_result = _jsonnet.evaluate_snippet(
    "bar.jsonnet",  # 给这个片段起个名字,方便报错时定位
    bar_code,
    import_paths=["jsonnet"]  # 告诉解析器去这个目录找导入的文件
)

# 如果需要转成Python字典用的话
import json
result_dict = json.loads(json_result)
print(result_dict)

3. Jsonnet文件里的导入写法

在jsonnet/bar.jsonnet里,直接用文件名导入同目录的baz.libsonnet就行,因为我们已经把jsonnet/设成了搜索路径:

local baz = import 'baz.libsonnet';

{
    sample_data: baz.some_value,
    custom_field: "hello from bar"
}

进阶:用绝对路径避免工作目录问题

如果你的foo.py可能在不同的目录下运行(比如不是从项目根目录启动),建议用绝对路径来指定Jsonnet目录,这样更稳:

import _jsonnet
import os
import json

# 获取当前脚本所在的绝对目录
script_root = os.path.dirname(os.path.abspath(__file__))
# 拼接jsonnet目录的绝对路径
jsonnet_dir = os.path.join(script_root, "jsonnet")

# 用绝对路径读取bar.jsonnet
with open(os.path.join(jsonnet_dir, "bar.jsonnet"), "r") as f:
    bar_code = f.read()

# 导入路径也用绝对路径
json_result = _jsonnet.evaluate_snippet(
    "bar.jsonnet",
    bar_code,
    import_paths=[jsonnet_dir]
)

result_dict = json.loads(json_result)
print(result_dict)

这样不管你从哪里运行foo.py,都不会出现找不到Jsonnet文件的问题啦。

内容的提问来源于stack exchange,提问作者ceridwen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:32:49