Pythonの高速化するならCythonで…

 という話もあるので、めも。

結論から言うと

 既にPythonで書いたコードがあるなら、Cython向けに既存のコードを整えて.pydを生成する方が楽かも。
 まだPythonで書いたコードがなくても、Pythonに親しんでいる人はCythonがいいかも。

 ならC言語使って.pyd作る理由なんてないじゃん。という意見も出るかもしれないけど、Pythonで閉じた環境で完結できるならそうだと思う。

C言語を使うメリットを考えてみると

 以下のようなことが思いつく。
 ・既にC言語で何らかの処理を書いている
 ・他のC言語ベースのライブラリを併用する
 ・Cで書く方が最適化の効果も得やすい可能性(Cythonとの比較で)
 ・並列化処理(マルチスレッド)の導入
 ・ゴリゴリにクロックやメモリサイズを削る最適化をしたい

 ただ、ゴリゴリに最適化する人はかなり限定されるハズなので、実際には既存のCライブラリの利用やマルチスレッドの導入がメインになりそう。

 DCCツール向けに開発している人だと、開発用のAPIはDLL提供されてるし、大量データの計算にスレッド処理も導入したくなるハズなので、頑張ってC言語を覚えるのも面白いのではないかな、と思います。

 Windowsだと環境整備が面倒、とかはあるかもしれませんが。。

実行ファイルにPython埋め込みでスクリプト処理させる

 とりあえず、サンプルになっている処理を書き換える形で試してみた。

 動作的には、以下の通り。
 ・自作のEXEを起動
 ・EXE内でPythonモジュールのメソッドをコール
 ・呼ばれたメソッドは、渡された値を処理して値を返す

 ポイントは、呼ばれたメソッド内でimportするモジュールが、自作のEXE内で登録したモジュールであるという所。
 Pythonスクリプトから自作のEXEを経由して別のプログラムを呼び出し、その結果を実行中のPythonスクリプトで処理できるので、自由度の高いPythonスクリプトを記述できるようになる。

 いろいろデータハンドリングが面倒なので、すんなりは出来ないかもしれないが、より自由度の高いPythonスクリプトの実装が可能になる。
続きを読む 実行ファイルにPython埋め込みでスクリプト処理させる

Pythonの仮想マシンの処理

Pythonの仮想マシンの処理について解説しているページを見つけたので、めも。

dis/inspect モジュールと ceval.c を使った Python のハッキング

Python Virtual Machine 関連のソース・コード

python のデコレーター構文@decorate

このくらいコード読めないと、埋め込みの実装とか難しいかなぁ…

PythonでMayaのPlugin作るのは

API2.0を使った方がいい。速度が違うので…
前回の記事は旧APIを参考にしていたのだけど、検索で引っ掛かったのが旧APIだったので…

これからPluginをPythonで書くなら、API2.0を使おう。

ヘキサドライブさんの記事が参考になると思う。
API2.0も旧APIも基本C++のラッパーなんで、基本的な所は同じ。
ただAPI2.0の方が、よりPythonっぽい書き方で実行速度も改善されてる。(ものによって数倍速いみたい)

MayaPluginをPythonで記述

めも。

記述の参考。

https://download.autodesk.com/us/maya/2009help/API/zoom_camera_cmd_8py-example.html
https://download.autodesk.com/us/maya/2009help/API/motion_trace_cmd_8py-example.html

たぶんplugin1つに複数コマンドを内包させるのは、registerCommandを複数呼ぶだけだと思う。

その後

試しに2つ定義してみたら、別々の実装を処理しに行った。
なので、複数コマンド用にクラス定義で実装を増やせばOK.

Boost.Pythonをビルドするには…

ライブラリのビルドがデフォルト設定に入ってないっぽいので、めも。

基本的な手順は、以下。
C++のクラスをPythonから使うためにBoost::Pythonを使うまで

自分の場合は、”user-config.jam”を書かないと駄目だった。

boost_1_71_0の場合には…
“boost_1_71_0\tools\build\example\user-config.jam”を、解凍した“boost_1_71_0”フォルダ直下にコピーして編集。
※Python3.7の場合は、以下のように記述した定義を一番最後の行にでも書いておく。

b2の実行時の指定を、以下のような感じに。
※ なかなかビルドがうまくいかなくて最終的に “–with-python” 指定をしているので、もしかするとPythonライブラリだけしかビルドしないかも…

Boost.Pythonを使うと

 .pyd モジュールを作る時の記述が、C言語で書くよりかなり簡略化できてちょっと試す時に便利。
 .pydファイルはDLLなので、関連へのパスを通しておく必要がある。(例えば、boostのlibフォルダ)
 もしimportで.pydモジュールがロードできない時は、関連のdllを読み込めてないので注意。

 Cで書くと、こちらの参考サイトみたいに、いろいろ定義が必要になる。

 ビルドについては、以下のような感じで。

記述時の参考に

【Python C API入門】C/C++で拡張モジュール作ってPythonから呼ぶ -前編-
c/c++をラップしてpythonで使えるように

続きを読む Boost.Pythonをビルドするには…

テクスチャやマテリアルのリストを取得する

fileノードとかそういうのを取得するのに、pluginによるノードとかどうやって集めれば??というのが、前から疑問だったので調べてみた。
要点としては、「HypershadeのTextureタブに列挙される要素の取得がしたい。」という話です。

結果としては、以下のコマンドで取得できた。

こっちは、マテリアル。

そのほかのタブ

ユーティリティ:DefaultRenderUtilitiesFilter
レンダリング:DefaultRenderingFilter
ライト:DefaultLightsAndOpticalFXFilter
カメラ:DefaultCameraShapesImagePlanesFilter
シェーディンググループ:DefaultShadingGroupsFilter
ベイクセット:DefaultBakeSetsFilter
アセットノード:DefaultContainerNodeFilter

Maya起動用ランチャー

少し前にMayaをコマンドラインから起動する件を投稿したけれど、なかなかコマンドラインやら環境設定やら難しい…という場合も多そうだよな。と思ったのでググってみたら公開している人がいらっしゃった。

arubertoson/maya-launcher

Pythonで単純に設定を管理するタイプのコマンドライン・スクリプトだけど、要はこういう話なので参考になるかも。

過去の投稿

VSCodeの環境を入れる

この辺かな~って感じのメモ。

会社ではVSCode利用者増えたし、そろそろ重い腰を上げてみようかと思ったり。。
※今回は、基本インストール不要のポータブル環境を検討。

いまさらQuickTimeのAtomの内容を収集する処理を書いてみる

metadataを取得したい。みたいな話があったのだけど、QuickTimeの場合はmetadataというかAtomの値を取得する感じでデータ取っていた記憶があるので、いまさらPythonで情報を取得する実験。

さすがに1から書くのも面倒なので、誰かコンテナ取得する処理書いてないかな~と検索したらいらっしゃいました
Mp4のファイルのコンテナを読み込む処理だけど、基本同じなので問題なし。

Python3.7で動かすと、そのままでは動かなかったのでちょっと手を入れつつ、必要なAtomの情報を取得できるようにAtomの情報を取り込んだり、対象のAtomを探しつつ読み込んだ情報を取得する簡単な処理を追加。

…で、一応FPSとか秒数を計算させてみた。
ざっくり、こんな感じで結果が出た。(’mvhd’, ‘stts’のAtomから、duration, TimeScale, SampleCountを取得)
※QuickTime7.7.9利用。エンコードはアニメーション、5秒(120フレーム)分を24FPSで出力。

以下、コード。
続きを読む いまさらQuickTimeのAtomの内容を収集する処理を書いてみる

With句の動作

参考:
with構文とは何なのか(@年中アイス)
Pythonのwithステートメントのまとめ(@$ cat /var/log/shin)
Pythonのwith構文で例外を補足する実例(@$ cat /var/log/shin)
Pythonのwith文(@まめりうむ )
with文(@PY習)

 結果から書くと、クラスを作って __enter__, __exit__メソッドの実装で、with
句開始行及びその後のブロックを抜ける際に其々実行される。
 ※__exit__の時に リソース開放処理(例えばcloseメソッド)を実行する。

 試しに、PySideのWidget.blockSignalを行う処理を自動開放してくれるクラスを書いてみたら、確かに自動開放された。

 こういうものをコンテキストマネジャと呼ぶらしい。
 Scipy lecture notesを読んでいて目にした。(コンテキストマネージャ)

Substance Automation Tool

思い出したので、これもめも。

substanceの機能を自動化するツールキット。
内容的には、バッチファイル用のコマンドラインツール、およびPythonによる自動処理用のライブラリ・パッケージのセット。
Indie版だとDesignerかsubscriptionを持っていると使える。Pro/Enterpriseの場合は、別途ライセンス提供という形になる模様。(ライセンス価格は非公開なので、要問い合わせ)

Substance Automation Toolkitとは@BornDigital
質感自動適用パイプラインの参考動画

Maya Python Pluginのこと

 すっかり忘れていたけど、Maya PluginはPythonでも記述できる。
 Pythonはインタプリタなので、単純操作での処理速度は(特に制限なく並列処理も可能な)ネイティブコードを実行できるC++に敵う筈もないけど、何も考えなくても基本的な処理の流れがある程度最適化された形で実行されるPythonも状況によっては遜色なく使える。
 ※特にMayaはごく最近のバージョンまで並列処理をなかなか安定的に処理できなかったし。。

MayaはParallel Evaluation(並列評価)という仕組みが2015か2016で実装されて以来、いままで少しずつ機能が整えられてきていて、2019辺りではようやく使えるかな…という気配も見えてきた気がする。
並列処理が難しいのは順不同で評価が始まる部分。評価順序に優先度がある場合には意図しない結果に繋がるので、まず評価に順序があるのかないのかをよく考える必要がある。

 
 今更C++を思い出そうとしていたけど、新しいPCには光学ドライブすら付いてなくてVisualStudioのインストールにも骨を折らないといけない状況なので、Pythonでやってみようかと思い始めたり。

 これはMaya2017ヘルプでの記述だけど、ざっくり言ってC++で書いていたような記述をPython形式で記述してMayaのPluginフォルダに入れてやれば、PythonでMayaのPluginを用意できる。

 DFTalkに記事があったので、これも引用しておく。

MayaのPluginを書くには、オブジェクト指向についての知識が必要になる。
「オブジェクト指向とはなにか?」については、簡単に説明することがとても難しい概念だけど、(オブジェクト指向とレスポンシビリティで)以前触れたことがある。このあたりに関しては書籍などもあたってみて、正しい知識を仕入れて欲しい。