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

处理从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 00:27:43