Maya 2023中Python3调用pymel的mel2py报错求助
Maya 2023 Python3下调用pymel mel2py工具出现AttributeError的解决方案
在Maya 2023中使用Python3调用pymel的mel2py工具时,触发以下错误:
Error: AttributeError: file C:\Program Files\Autodesk\Maya2023\Python\lib\site-packages\pymel\tools\mel2py\melparse.py line 438: 'str' object has no attribute 'lineno'
测试代码如下:
import pymel.tools.mel2py as mel2py pythonCode = mel2py.mel2pyStr( """ setDrivenKeyframe -currentDriver pCube1.translateY pCube2.translateX; setDrivenKeyframe -currentDriver pCube1.translateY pCube2.translateY; setDrivenKeyframe -currentDriver pCube1.translateY pCube2.translateZ; """,pymelNamespace='pm') print( pythonCode )
错误原因
该问题确实由Python3兼容性差异导致:pymel的mel2py模块部分逻辑沿用了Python2的文本对象特性,而Python3中普通字符串不再具备lineno属性,从而触发报错。
解决方案
方案1:修改pymel源码修复兼容性
找到报错文件C:\Program Files\Autodesk\Maya2023\Python\lib\site-packages\pymel\tools\mel2py\melparse.py的第438行,将涉及lineno的代码做兼容调整:
# 替换原获取行号的代码,处理字符串类型的token lineno = token.lineno if not isinstance(token, str) else 1
核心逻辑是判断token是否为字符串,若是则赋予默认行号(如1),否则正常读取lineno属性。
方案2:绕开mel2py,手动转换MEL代码
若不想修改源码,可直接将原MEL代码转换为等效的pymel代码,功能完全一致且适配Python3:
import pymel.core as pm # 手动转换后的驱动关键帧代码 pm.setDrivenKeyframe(pm.PyNode('pCube2').translateX, currentDriver=pm.PyNode('pCube1').translateY) pm.setDrivenKeyframe(pm.PyNode('pCube2').translateY, currentDriver=pm.PyNode('pCube1').translateY) pm.setDrivenKeyframe(pm.PyNode('pCube2').translateZ, currentDriver=pm.PyNode('pCube1').translateY)
内容的提问来源于stack exchange,提问作者teddude75
相关产品推荐
相关产品推荐

