You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Maya 2018多选元素触发'exceptions.RuntimeError'无errno属性错误及GUI失效求助

搞定Maya 2018多选组件触发的AttributeError及GUI失效问题

嘿,我之前在Maya 2018里也碰到过类似的坑,结合经验给你拆解下问题和解决办法:

首先说这个错误的根源:你看到的AttributeError: 'exceptions.RuntimeError' object has no attribute 'errno',本质是Maya内部的某个Python回调脚本(就是报错里的<string>第88行)在处理组件选择事件时犯了个低级错误——它试图访问RuntimeError对象的errno属性,但Maya 2018的Python环境里,RuntimeError根本没有这个属性!这个未被捕获的异常会直接打断Maya的UI事件循环,导致后续的自定义GUI按钮点击完全没反应,因为Maya的UI线程被异常卡壳了。

接下来分步骤给你解决思路:

1. 先排查第三方脚本/插件的锅

首先回忆下出问题前有没有装新的插件、或者改过userSetup.py这类自定义脚本?很多时候这种异常都是第三方工具的回调逻辑没处理好导致的。

  • 试试安全模式启动Maya:按住Shift键启动,选择不加载任何用户插件和脚本。如果此时多选组件不报错了,那肯定是某个第三方工具的问题,逐个加载排查就能找到元凶。

2. 给Maya的异常加个“安全垫”

如果是Maya内置脚本的bug(Maya 2018确实有几个这类回调的小问题),可以给全局Python异常加个捕获器,不让异常扩散到UI线程:

import sys
import traceback

def catch_all_exceptions(exctype, value, tb):
    # 把异常信息打印出来方便排查,但不中断Maya运行
    traceback.print_exception(exctype, value, tb)
    return True

sys.excepthook = catch_all_exceptions

把这段代码加到你的自定义脚本开头,或者userSetup.py里,这样再触发那个错误时,只会在脚本编辑器里打日志,不会阻塞GUI按钮了。

3. 修复内置脚本的错误(如果能定位到的话)

如果能找到报错的<string>对应的实际脚本(可能是Maya安装目录下的Python文件,或者是动态执行的代码),可以直接修改它的异常处理逻辑:
比如原代码可能是这样的:

try:
    # 某些组件选择相关的操作
except RuntimeError as e:
    if e.errno == 123:  # 这里试图访问errno,但RuntimeError没有这个属性
        # 处理逻辑

改成判断属性是否存在再访问:

try:
    # 某些组件选择相关的操作
except RuntimeError as e:
    if hasattr(e, 'errno') and e.errno == 123:
        # 处理逻辑

4. 临时规避方案

如果暂时找不到根源,先试试这些临时办法:

  • 多选组件时尽量用框选,而不是逐个点击加选(某些情况下逐个加选更容易触发这个回调异常);
  • 每次触发错误后,在脚本编辑器执行cmds.evalDeferred(lambda: None),强制刷新Maya的UI线程,自定义按钮就能恢复点击了。

5. 顺便检查下你的自定义GUI代码

有时候按钮失效不一定全是这个错误的锅,也可以自查下:

  • 确保按钮的命令绑定是cmds.button(command=你的函数名),而不是command=你的函数名()(后者会导致函数只在创建按钮时执行一次,点击时没反应);
  • 如果按钮的逻辑比较耗时,用cmds.evalDeferred(你的函数名)来延迟执行,别让UI线程被卡住。

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

火山引擎 最新活动