Q100398:解决 Nuke 11+ 中的 PySide 错误

症状

使用Nuke 11.0v1 或更高版本启动 Python 脚本时,如果脚本需要 Python 的 PySide 模块,则Nuke将抛出异常,阻止脚本打开。

下面显示的是,如果在Nukeinit.py文件中导入了 PySide 模块,则在启动Nuke时会发生以下异常:
Nuke的启动终端中,将显示一个ImportError ,指出Nuke无法导入 PySide 模块,在本例中为PySide.QtCore

原因

随着Nuke 11.0v1 的发布,许多库进行了更改,使Nuke VFX 参考平台符合要求。
对于 PySide, Nuke核心库中的版本已从 PySide 1.2.2 更新至 PySide 2.0,因此现在可以将其导入为 Pyside2 而不是 PySide。有关Nuke当前附带的库版本的更多信息,请参阅文档中的“第三方库和字体”部分。
由于 PySide 更新为 PySide2,从Nuke 11.0v1 开始,PySide 模块将不再可调用。
例如:
import PySide.some_module
已替换为:

import PySide2.some_module
此外,一些类的定义已在不同模块之间移动。这尤其影响到所有与 GUI 相关的类,它们大多已从PySide.QtGui移动到PySide2.QtWidgets ,但也有其他模块进行了迁移。

解决

要解决启动Nuke时出现ImportError异常,需要修改“.nuke”文件夹中所有使用 PySide 的脚本,以便在执行之前捕获该异常。
可以通过修改导入语句来调用tryexcept函数,并在导入 PySide 模块时捕获ImportError来处理异常。
如果捕获到异常,可以添加调用来导入 PySide2 等效函数,这将防止启动时出现ImportError错误。

更多信息

如“原因”部分所述,部分 GUI 相关功能已移至其他模块。用于所有 GUI 相关任务的 PySide 模块PySide.QtGui大部分已移至PySide2.QtWidgets模块。
在大多数情况下,使用此模块时,为了避免Nuke中的ImportError ,并且不再需要重构脚本中的每个Pyside.QtGui函数,而是应该将PySide2.QtWidgets作为QtGui导入。
这可以通过以下代码片段进行设置:
try:
    from PySide import QtGui, QtCore
except ImportError:
from PySide2 import QtCore
from PySide2 import QtWidgets as QtGui
这样一来,旧版 PySide 代码就能在 PySide2 中运行,因为大多数 QtGui 函数都已迁移到 QtWidgets 模块。请注意:这适用于许多 PySide 模块,但并非所有模块都适用,因此您可能仍然需要更新代码的其他部分。
为了确保使用 PySide 模块的脚本在Nuke 11 和Nuke 12 中正常工作,您需要完成过渡,并且所有PySide函数都需要重构为PySide2版本。
如果您希望在使用 PySide 和 PySide2 时,在Nuke 10.5 和Nuke 11 或 12 之间保持代码兼容性, Qt.py 项目提供了一个流程,可以根据您的Nuke版本切换 PySide 和 PySide2 模块。
注意:Qt.py 项目由第三方创建,因此,任何问题或疑问都需要向第三方项目所有者报告。

延伸阅读

如果您想了解更多关于异常处理的信息,可以访问以下链接查看 Python 异常处理文档: Python 文档 - 异常处理

有关解决Nuke 16+ 中 PySide 错误的更多信息,请参阅以下文章:
Q100715:如何解决Nuke 16+ 中的 Python PySide 问题

    我们很遗憾听到

    请告诉我们