Maya2013導入で発生した開発室での出来ごと
2013/4/1
お久しぶりです
開発室の齊藤です
Autodesk 2014製品が発表されました! 早速2014の紹介を!!
ではなく、今回はMaya 2013 を導入する際に起こった、開発室での出来事から2つを紹介します
Pythonモジュールの用意
最初はPythonモジュールについて。
Maya2013からWinodwsでは開発環境が、VisualStudio2008から2010へと変わりました。
この変更は、一部のPythonモジュールにも影響が及びます。
Maya2013でPythonモジュールインポートするとエラーが出る報告がありました。
ImportError: DLL load failed: The specified module could not be found. |
エラーを見ても、いつも通りぶっきらぼうに言っています。 “どの”DLLなのか教えてくれない。
最初は環境変数PATHの設定間違えか?などと疑いました。
しかし、このエラー原因を突き詰めていくとあるファイルに辿りつきます。
拡張子がpydのファイルです。
pydファイルはC/C++で書かれたコードをビルドすることで作られるファイルです。
この問題の原因は、pydファイルがMSVCR90.dllを要求することに起因します。
MSVCR90.dllはVisualStudio2008です。
冒頭の通り2013から、VisualStudio2010です。
と言うことで、モジュールをVisualStudio2010でビルドすることで、エラーは解決します。
じゃぁビルドしていくかとなるわけですが、ここからが大変な話でした。
ビルドする際に以下のコマンドを使うモジュールがあります
> python setup.py build |
この場合にもちろんpython.exeが必要ですが、ここに問題があります。
Mayaが使っているPythonのバージョンは2.6です。公式で配布されているものはVisualStudio2008でビルドされたものです。
VisualStudio2010でビルドされたPythonは配布されていません。
今回の対象はMayaだったので、そもそもMayaにないのか?っと探るとありました。名前を変えて。
Mayaインストールディレクトリ/bin/mayapy.exe |
このexeを用いて、モジュールのビルドは進みました。
しかし、ビルド途中でエラーが発生するモジュールが現れます。NumPyです。
NumPyではビルド途中で、”マニフェストが見つからない”とエラーが発生しました。
最初はNumPyビルド時の設定ミスか、バグかと疑いました。
しかし、エラーを探るとPythonのIssue TrackerからIssue16296というのを発見しました。
バグに対してパッチが出ていたので、パッチを当てたPythonを使うことでビルドが通りました。
このようにエラーが出るモジュールもあれば、すんなりビルドが通るモジュールもあります。
エラーが出れば都度解決方法を見つけてビルドしていきました。
現在、リビルドが必要だと分かっているモジュールとしては、以下のものが挙げられます
・NumPy
・PyQt
・PySide
・PyWin32 (Python for Windows extensions)
モジュールの中でも一部だけがエラーを起こすこともあり、最初は使えると思っていても後に問題になることがあります。
MFnBaseの仕様変更
次は、Maya APIの仕様変更で起きたことを1つ。
Maya2013から、MFnBaseクラスのコピーコンストラクタがプライベートになりました。
だから何だという話もあると思います。
Mayaのバージョンが変わると、社内で開発されたプラグインをMaya2013に向けてビルドをします
ビルドが成功する中、とあるプラグインで以下のC2248のエラーが大量に発生しているプラグインが現れました。
error C2248: ‘MFnMeshData::operator =’ : private メンバー (クラス ‘MFnMeshData’ で宣言されている) にアクセスできません。(省略) |
何が起きたんだと探っていると、MFnBaseクラスのコピーコンストラクタがプライベートになっていることを発見。
そこから、問題のプラグインのコードを探っていき問題のコードに辿りつきました。
std::vector< MFnMesh > … |
問題のクラスはMFnBaseですが、クラス名からの想像通りこのクラスは、MFn~となっているクラスに影響をします。
今回のは上記のコードが原因で、MFnMeshのコピーコンストラクタを呼ぶことになり、エラーを出していたというものです。
このエラーを出しているプラグインには、他にもstd::vector< MFn~> があり大量のエラーを生み出していました。
なので以下のように書き換え
std::vector< MFnMesh* > … |
その後、他の部分も正常に動作するようにコードを書き換えて、この問題は解決しました。
最後に
MFnBaseの仕様変更については、あまり話が出ないのはわかるんですが
Pythonモジュールの話は、あまり情報が無いんですよね。
今回発表された2014導入するとなると、どんな出来事があるのかドキドキします。
コメント
コメントフォーム