处理从Nuke获取的带续行符与转义字符的Python代码解析问题
处理Nuke导出Python表达式的转义与AST解析问题
问题场景
从Nuke节点旋钮中提取Python表达式时,会遇到软件自动添加的转义字符和续行符干扰解析:
- 用户在Nuke中输入的原始代码:
if nuke.frame()>1: ret=nuke.frame()/2 else: ret=nuke.frame()
- 通过Nuke Python API获取代码的方式:
animation_curve = n['multiply'].animation(0) code_string = animation_curve.expression()
- 拿到的原始字符串(包含Nuke的包装格式):
[python -execlocal if\ nuke.frame()>1:\n\ \ \ ret=nuke.frame()/2\nelse:\n\ \ \ ret=nuke.frame()]
- 正则提取后的纯代码部分:
if\ nuke.frame()>1:\n\ \ \ ret=nuke.frame()/2\nelse:\n\ \ \ ret=nuke.frame()
遇到的错误
执行ast.parse(code_string)时触发语法错误:
if\ nuke.frame()>1:\n\ \ \ ret=nuke.frame()/2\nelse:\n\ \ \ ret=nuke.frame() ^ SyntaxError: unexpected character after line continuation character
限制条件
- 不能用
.replace()无脑删除反斜杠,代码中可能存在合法的反斜杠转义 - 出于安全风险,禁止使用
exec()
解决方案思路
1. 针对性清理Nuke的特殊转义
Nuke的转义是为了存储时保留格式,需要区分软件添加的冗余转义和代码本身的合法转义,分三步处理:
步骤1:解码HTML实体
把>这类HTML实体转成对应的Python符号:
import html code = html.unescape(extracted_code)
步骤2:移除Nuke添加的空格转义
Nuke会给普通空格前加\,但合法续行符是\+换行,用正则匹配并替换非续行场景下的\ :
import re # 匹配"反斜杠+空格",且前面不是换行转义的情况 code = re.sub(r'(?<!\\n)\\ ', ' ', code)
步骤3:还原换行符
把字符串中的\n转成实际的换行符:
code = code.replace(r'\n', '\n')
2. 安全的AST解析与执行
清理后的代码可通过AST解析,再通过自定义节点遍历器提取逻辑,避免使用exec():
import ast # 自定义AST遍历器,提取ret变量的赋值表达式 class ReturnValueExtractor(ast.NodeVisitor): def __init__(self): self.return_expr = None def visit_Assign(self, node): if node.targets[0].id == 'ret': self.return_expr = node.value # 清理后的代码示例 cleaned_code = """if nuke.frame()>1: ret=nuke.frame()/2 else: ret=nuke.frame()""" # 解析AST并提取核心表达式 tree = ast.parse(cleaned_code) extractor = ReturnValueExtractor() extractor.visit(tree) # 模拟执行(替换nuke.frame()为具体帧号) frame_num = 5 expr_str = ast.unparse(extractor.return_expr).replace('nuke.frame()', str(frame_num)) result = ast.literal_eval(expr_str) print(result) # 输出2.5
3. 兼容合法转义
上述处理仅针对Nuke添加的冗余转义,代码中合法的反斜杠(比如字符串内的\\n)会被保留,不会影响正常解析。
内容的提问来源于stack exchange,提问作者masky007
相关产品推荐
相关产品推荐

