如何在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
相关产品推荐
相关产品推荐

