Q100398: Nuke 11+ での PySide エラーの解決

症状

Nuke 11.0v1 以降で Python スクリプトを起動するときに、スクリプトに Python の PySide モジュールが必要な場合は、 Nuke例外をスローし、スクリプトが開けなくなります。

以下に示すように、 Nukeinit.pyファイルに PySide モジュールがインポートされている場合、 Nukeの起動時に次の例外が発生します。
Nukeの起動ターミナル内に、 Nuke PySide モジュール (この場合はPySide.QtCore ) をインポートできなかったことを示すImportError表示されます。

原因

Nuke 11.0v1 のリリースでは、多くのライブラリの変更が行われ、 Nuke VFX Reference Platform が準拠するようになりました。
PySideの場合、 Nukeコアライブラリ内でPySide 1.2.2からPySide 2.0にアップデートされたため、PySideではなくPyside2としてインポートできるようになりました。現在Nukeに同梱されているライブラリのバージョンの詳細については、ドキュメントの「サードパーティ製ライブラリとフォント」セクションをご覧ください。
PySide から PySide2 へのこのアップデートの結果、 Nuke 11.0v1 以降では PySide モジュールは呼び出せなくなりました。
例えば:
import PySide.some_module
は次のように置き換えられました:

import PySide2.some_module
さらに、一部のクラスの定義がモジュール間で移動されました。これは特にGUI関連のクラスに影響し、そのほとんどはPySide.QtGuiからPySide2.QtWidgetsに移動されましたが、他のモジュールも移動されています。

解決

Nuke起動時にImportError例外を解決するには、実行前に例外をキャッチするように '.nuke' フォルダ内の PySide を使用するスクリプトを変更する必要があります。
例外を処理するには、インポート ステートメントを変更して、 try関数とexcept関数を呼び出し、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バージョンとしてリファクタリングする必要があります。
Nuke 10.5 とNuke 11 または 12 の両方で PySide と PySide2 を使用するときにコードの互換性を確保したい場合は、 Qt.py プロジェクトで、 Nukeのバージョンに応じて PySide モジュールと PySide2 モジュールを切り替えるプロセスが提供されています。
注意: Qt.py プロジェクトはサードパーティによって作成されているため、問題や質問がある場合はサードパーティのプロジェクト所有者に報告する必要があります。

追加の読み物

例外処理についてさらに詳しく知りたい場合は、次のリンクから例外に関するPythonドキュメントを参照してください: Pythonドキュメント - 例外処理

Nuke 16 以降で PySide エラーを解決する方法の詳細については、次の記事を参照してください。
Q100715: Nuke 16+ で Python PySide の問題を解決する方法

    私たちはそれを聞いて申し訳ございません

    理由をお聞かせください