Q100398:如何在 Nuke 11+ 中使用 PySide Python 脚本克服问题

关注

症状

当使用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 的任何脚本都需要进行更改,以在执行前捕获异常。
处理异常可以通过修改 import 语句来调用tryexcept函数,并在导入 PySide 模块时捕获ImportError来完成。
如果捕获到异常,可以添加调用来导入 PySide2 等效函数,这将防止启动时出现ImportError错误。

更多信息


正如原因部分所述,一些 GUI 相关功能已移至其他模块。用于所有 GUI 相关任务的 PySide 模块PySide.QtGui大部分已移至PySide2.QtWidgets模块。
在大多数情况下,使用此模块时,为了避免Nuke中出现ImportError ,并且您现在应该将PySide2.QtWidgets导入为QtGui ,而不是重构脚本中的每个Pyside.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版本。
如果您希望在Nuke 10.5 和Nuke 11 或 12 上使用 PySide 和 PySide2 时具有代码兼容性, Qt.py 项目提供了一个根据您的Nuke版本切换 PySide 和 PySide2 模块的过程。
注意:Qt.py 项目是由第三方创建的,因此,任何问题或疑问都需要向第三方项目所有者报告。

补充阅读


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

    我们很遗憾听到

    请告诉我们