将 Maya 的 Python 2 代码迁移到 Python 3 可以通过以下步骤高效完成,结合自动化工具和手动调整:
______________________________________________________
1. 确认环境和依赖
-
Maya 版本:确保使用 Maya 2020+(原生支持 Python 3)。
-
第三方库:检查代码依赖的库(如
pymel、numpy)是否兼容 Python 3。 -
备份代码:防止转换过程中意外损坏原有代码。
______________________________________________________
2. 使用自动化工具转换
(1) 2to3 工具
Python 自带的 2to3 工具能自动修复大部分语法差异:
# 生成差异报告(不修改原文件)
2to3 your_script.py
# 直接转换并保存
2to3 -w your_script.py
常见修复项:
-
print "Hello"→print("Hello") -
xrange→range -
except Exception, e→except Exception as e -
/除法行为(自动添加from __future__ import division)
(2) futurize 或 modernize
对复杂项目,使用更灵活的库:
# 安装 futurize
pip install future
# 生成兼容 Py2/Py3 的代码
futurize --stage1 your_script.py # 基础语法修复
futurize --stage2 your_script.py # 兼容性包装器
_______________________________________________________
3. 手动修复 Maya 相关代码
(1) 字符串与字节类型
-
Maya API 如
cmds在 Py3 中严格区分str(Unicode)和bytes: -
# Py2: 混合使用 str/unicode;Py3: 强制使用 str file_path = u"/unicode/path" # 显式定义 Unicode cmds.file(file_path, open=True)
(2) 迭代器方法
-
dict.keys()、dict.values()返回视图(非列表): -
# 需要列表时强制转换 keys = list(cmds.ls().keys())
(3) 除法行为
-
确保除法符
/符合预期(Py3 中3/2=1.5,Py2 中3/2=1): -
# 显式声明整数除法 result = 3 // 2 # 结果为 1
_______________________________________________________
4. 处理第三方库兼容性
-
PyMel:确保使用
pymel 1.3+(支持 Python 3)。 -
C 扩展:如
mayapy相关模块需重新编译为 Py3 版本。
_______________________________________________________
5. 测试与调试
-
逐步运行:在 Maya 的 Python 3 环境中分段测试代码。
-
常见错误:
-
TypeError: unicode expected:将字节字符串转为str。 -
NameError: name 'xrange' is not defined:替换为range。 -
ImportError:检查模块是否支持 Py3。
-
————————————————————————————————
6. 进阶工具与技巧
-
静态类型检查:用
mypy分析类型不匹配。 -
兼容性层:使用
six库处理 Py2/Py3 差异: -
from six.moves import range # 兼容 Py2 的 range import six # 处理字符串类型
————————————————————————————————
示例:转换前后对比
Python 2 原始代码
import maya.cmds as cmds
def get_meshes():
meshes = cmds.ls(type="mesh")
print "Found %d meshes" % len(meshes)
for mesh in meshes:
parent = cmds.listRelatives(mesh, parent=True)[0]
if isinstance(parent, unicode):
print parent
Python 3 转换后
import maya.cmds as cmds
def get_meshes():
meshes = cmds.ls(type="mesh")
print("Found %d meshes" % len(meshes))
for mesh in meshes:
parents = cmds.listRelatives(mesh, parent=True)
if parents: # 防止 None 索引
parent = parents[0]
if isinstance(parent, str): # 替代 unicode
print(parent)
———————————————————————————————————
总结
-
自动化工具处理基础语法(
2to3、futurize)。 -
手动调整涉及字符串、迭代器、除法的逻辑。
-
测试验证在 Maya 的 Py3 环境中逐步执行。
遇到 Maya API 的特定问题时,可参考 Autodesk 官方迁移指南:Maya Python 3 支持文档。


296

被折叠的 条评论
为什么被折叠?



