Maya中Python相对模块导入失效报错问题求解
问题成因与操作错误
你遇到的导入错误由两个核心问题导致:
- 包名与导入路径不匹配:你描述中提到scripts目录下存放的文件夹名为
packageFolder,但导入语句里写的顶层包名是package,二者不一致会直接导致导入失败。从报错路径看你后续可能将文件夹重命名为了package,但还有第二个更核心的环境兼容问题。 - Python版本导入规则不兼容:Maya 2020内置运行环境为Python 2.7,你在包的
__init__.py中使用的是Python 3风格的全路径绝对导入。Python 2在执行包自身的初始化文件时,包本身还未完成注册到系统模块列表的流程,此时写全顶层包名的导入语句不会优先搜索当前包目录,会直接去全局模块路径下找Classes模块,自然触发找不到模块的报错。
修复方案
二选一即可解决问题:
方案1:使用跨版本兼容的相对导入(推荐)
直接修改package/__init__.py中的导入语句,去掉顶层包名,用相对导入语法指向当前包内的子模块:
# 导入Classes子包下的ExampleClass模块 from .Classes import ExampleClass # 导入Utils子包下的工具模块同理 from .Utils import SomeUtilModule
语法中开头的.代表当前包所在目录,Python 2和Python 3都能正确识别,不会出现全局路径搜索错误。
方案2:开启绝对导入兼容
如果要保留全路径写法,在__init__.py所有导入语句的最顶部加一行future声明,切换为Python 3风格的导入规则即可:
from __future__ import absolute_import # 原有导入语句放在声明之后即可正常运行 from package.Classes import ExampleClass
额外注意事项
- 导入前先确认
C:\Users\USERNAME\Documents\maya\2020\scripts路径在Maya的Python搜索路径中,可以在Maya脚本编辑器执行import sys; print(sys.path)查看,默认状态下Maya会自动加载该路径,无需手动添加。 - 你当前的导入语句
from package.Classes import ExampleClass导入的是ExampleClass.py这个模块文件,不是文件内定义的同名类。如果要导入类本身,需要补全路径:from .Classes.ExampleClass import ExampleClass,不要混淆模块名和类名。 - 修改代码后需要清理Maya的模块缓存,否则会优先加载之前的错误缓存导致修改不生效,可以执行以下代码清理缓存再重新导入,或者直接重启Maya:
import sys [sys.modules.pop(k) for k in list(sys.modules.keys()) if k.startswith('package')]
内容的提问来源于stack exchange,提问作者Marten Zander
相关产品推荐
相关产品推荐

