Python中JSONPath参数传递异常:函数内定义变量不生效的原因及解决方法
这问题我之前也碰到过,核心是JSONPath表达式和Python变量的作用域/引用方式没搞对,我来给你拆解下:
为什么会出现这种现象?
当你把real_path定义在check函数内部时,你写的JSONPath字符串里的real_path并没有被解析成Python变量的值——JSONPath引擎只会把它当成一个字面量字符串来处理,也就是它在找process_path等于**字符串"real_path"**的进程,而不是你实际定义的那个路径,当然匹配不到结果。
至于你说移到main里就正常工作,其实你贴的修改后代码是有问题的:check函数里根本没有定义real_path,也没接收这个参数,运行时应该会抛出NameError才对。大概率是你实际修改时不小心把real_path变成了全局变量,或者用了字符串格式化把变量值注入到表达式里,只是代码贴错了😅。
把real_path定义在check函数内部的正确处理方式
要让JSONPath正确使用Python变量的值,你需要把变量值主动注入到JSONPath表达式字符串中,这里有两种常用的靠谱方式:
方式1:用f-string格式化(推荐,Python3.6+)
用f-string直接把real_path的值替换到表达式里,注意要给路径值加上单引号(JSONPath里字符串必须用引号包裹):
def check(path): with open(path,'r', encoding="utf-8") as f: file = json.load(f) real_path = 'C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\5.exe' # 用f-string注入变量值,外层用双引号,内层用单引号包裹路径 call = jsonpath(file, f"$.behavior.processes[?(@.process_path=='{real_path}')].calls[?(@.category=='network')]") print(call) if __name__ == "__main__": path = "C:/users/hdl/Desktop/2min/2-5.json" check(path)
方式2:用str.format()方法(兼容低版本Python)
如果你的Python版本低于3.6不支持f-string,可以用str.format()来替换变量:
def check(path): with open(path,'r', encoding="utf-8") as f: file = json.load(f) real_path = 'C:\\Documents and Settings\\Administrator\\Local Settings\\Temp\\5.exe' # 先定义带占位符的表达式,再用format注入变量 json_expr = "$.behavior.processes[?(@.process_path=='{}')].calls[?(@.category=='network')]".format(real_path) call = jsonpath(file, json_expr) print(call) if __name__ == "__main__": path = "C:/users/hdl/Desktop/2min/2-5.json" check(path)
额外注意点
如果你的路径里包含单引号,直接字符串注入会导致JSONPath表达式语法错误,这时候可以考虑用支持变量上下文的JSONPath库(比如jsonpath-ng),不过对于大多数简单场景,上面的方法已经足够解决问题了。
内容的提问来源于stack exchange,提问作者June-Solstice

