Q100398: Nuke 11 以降で PySide Python スクリプトを使用して問題を解決する方法

フォローする

症状

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

以下に示すように、PySide モジュールがNukeinit.pyファイルにインポートされている場合、 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に同梱されているライブラリのバージョンの詳細については、ドキュメントの「サードパーティのライブラリとフォント」セクションを参照してください。
Nuke 11.0v1 以降、PySide から PySide2 へのこの更新の結果、PySide モジュールは呼び出せなくなりました。
例えば:
import PySide.some_module
は次のように置き換えられました。

import PySide2.some_module
さらに、一部のクラスの定義がモジュール間で移動されました。これは特に GUI 関連のクラスに影響を与えます。これらのクラスは主にPySide.QtGuiからPySide2.QtWidgetsに移動されましたが、同様に再配置された他のモジュールもあります。

解決


Nukeの起動時にImportError例外を解決するには、PySide を使用する '.nuke' フォルダー内のスクリプトを、実行前に例外をキャッチするように変更する必要があります。
例外の処理は、インポート ステートメントを変更してtry関数とexcept関数を呼び出し、PySide モジュールのインポート時にImportErrorをキャッチすることで実行できます。
例外がキャッチされた場合は、PySide2 と同等の関数をインポートするための呼び出しを追加できます。これにより、起動時のImportErrorエラーが回避されます。

さらに詳しい情報


「原因」セクションで述べたように、GUI 関連の機能の一部は他のモジュールに移動されました。すべての GUI 関連タスクに使用される PySide モジュールPySide.QtGui 、ほとんどがPySide2.QtWidgetsモジュールに移動されました。
ほとんどの場合、このモジュールを使用する場合、 Nuke内のImportErrorを回避し、スクリプト内の各Pyside.QtGui関数をリファクタリングする代わりに、代わりにPySide2.QtWidgetsQtGuiとしてインポートする必要があります。
これは、次のスニペットに示すように設定できます。

try:
    from PySide import QtGui, QtCore
except ImportError:
from PySide2 import QtCore
from PySide2 import QtWidgets as QtGui
これにより、QtGui 関数のほとんどが QtWidgets モジュールに移動されたため、古い PySide コードを PySide2 で実行できるようになります。: これは多くの 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 ドキュメント - 例外の処理

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

    理由をお聞かせください