Maya, Houdini, blender, Nuke でのPythonインタープリタ

# これはなに？
DCCツールとかその辺りでは拡張用の言語としてPythonが採用されていることが多いです。
（タイトルに挙げた以外だと、Softimage、3dsMax、Cinema4D、LightWave、modo、3D-Coat、Motionbuilder、Metasequoia、Vueあたりも。Adobeは頑なにjsx)

これらのPython環境は、アプリケーション本体(GUI)を立ちあげなくても
対話モードで使えたりします。
タイトルに挙げた4つで確認してみました。

- Autodesk Maya [>web](http://www.autodesk.co.jp/products/maya/overview)
- Side Effects Houdini [>web](http://www.sidefx.jp/index.php)
- blender [>web](https://blender.jp/)
- The Foundry NUKE [>web](https://www.thefoundry.co.uk/products/nuke/)

## 環境
- Microsoft Windows [Version 10.0.10240]
 - ※Autodeskファミリーはいまのところwin10に正式対応してません
- ConEmu 150913 [64]　[>web](http://conemu.github.io/)

# Maya
Mayaインストールフォルダのbin内の**mayapy.exe**を使います。

例：
`C:\Program Files\Autodesk\Maya2016\bin\mayapy.exe`

公式ドキュメント：
http://help.autodesk.com/view/MAYAUL/2016/JPN/?guid=GUID-83799297-C629-48A8-BCE4-061D3F275215

## モジュール
Mayaの機能を使うためのモジュールは現在二種類あります。

- Maya Python (または単にcmdsとも)
- PyMEL

多くの場合、前者は`import maya.cmds as cmds`（とか`～～as mc`）、
後者は`import pymel.core as pm`（とか`～～as pmc`）として利用します。
後者は前者をオブジェクティブにラップしたものです（ざっくり
もともと外部で開発されていたものですが、Maya2011から標準搭載されるようになりました。
githubで公開されています。
https://github.com/LumaPictures/pymel

### Maya Python
maya.cmdsは、読み込めはしますが、

`import maya.cmds as mc`

中を見てみても、使える感じじゃありません

```
>>> dir(mc)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
```
**initialize**してあげると、使えるようになります。
下記はドキュメントにあった例文(▼)

```python:initialize
try: 			
    import maya.standalone 			
    maya.standalone.initialize() 		
except: 			
    pass
```
![mayapy.png](https://qiita-image-store.s3.amazonaws.com/0/102581/8fe05b5a-02df-7bc2-2c9f-8b63f3f1836f.png)
みたいな。

### PyMEL
PyMELも読み込めます。
読んだ途端にMaya起動時にスクリプトエディタに出るのと同様のログがプリントされます。

`import pymel.core as pm`

cmdsをinitializeしたときはメモリ109MBくらいでしたが、PyMELだと475MBくらい行きました。
GUI込みの、普通のMaya起動だと677MBくらい。
![mayapy_memory.png](https://qiita-image-store.s3.amazonaws.com/0/102581/590c9d9b-f5c2-7060-0864-da4f3177f321.png)

ちなみにPyMEL読み込む処理の中にinitializeも含まれてます。
古事記にもそう書かれている。
https://github.com/LumaPictures/pymel/blob/master/pymel/internal/startup.py

# Houdini
Houdini インストールフォルダの**hython.exe**を使います。

例：
C:\Program Files\Side Effects Software\Houdini 15.0.244.16\bin\hython.exe


なんとなくsys.argv

```
>>> sys.argv
['C:\\PROGRA~1\\SIDEEF~1\\HOUDIN~1.16\\houdini\\python2.7libs\\houdiniInterpreter.py']
```
なるほどね。

## モジュール
Houdiniの機能を使うためのモジュールは「**hou**」モジュールです。
hython.exeを起動した時点で読み込まれてます。

```
>>> dir()
['__builtins__', '__doc__', '__name__', 'hou']
```
中にはいろいろ入ってます。
![dir_hou.png](https://qiita-image-store.s3.amazonaws.com/0/102581/1ab5c3c1-4949-1ade-e66f-016d79476367.png)

公式ドキュメント：
http://www.sidefx.com/docs/houdini15.0/hom/commandline
※日本語版は、パブリックなものとしては12で止まっており、国内代理店と契約すれば最新版が見れるようです。
http://sidefx.jp/doc/hom/

なお、単純に「hython」で検索すると、Haskell実装Pythonというのも出てきますのでちょっと注意。

##numpy
hython環境では、デフォルトでnumpyが読み込めます。
ありがてえありがてえ(

# blender
blender を、「**--python-console**」というオプションを付けて起動します。

例：
`"C:\Program Files\Blender Foundation\Blender\blender.exe" --python-console`
![blender_console.png](https://qiita-image-store.s3.amazonaws.com/0/102581/24397cd4-c4ca-34c4-c5ad-40e51e66ebae.png)
何よりも無言のblenderウィンドウがどぅーーんと立ち上がるのが印象深いです（立ち上がりますが、特に使わないウィンドウです）。

なんとなくsys.argv

```
>>> sys.argv
['blender-app.exe', '--python-console']
```
なるほどね。

## モジュール
blenderの機能を使うためのモジュールは「**bpy**」モジュールです。
読み込みます。

`import bpy`

中身。ある程度まとめられてます。

```
>>> dir(bpy)
['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'app', 'context', 'data', 'ops', 'path', 'props', 'types', 'utils']
```
…じっくり使ったわけではないのでこれで使える状態なのかとかよく分かりません(笑
（なんかblender(GUI)上のPython Consoleとは読まれてるクラスとかが違うような気も。）

公式ドキュメント：
http://wiki.blender.org/index.php/Doc:JA/2.6/Manual/Render/Command_Line
※日本語版は2.6。最新はこちら
http://www.blender.org/manual/advanced/command_line.html?highlight=python#python-options
「Render」カテゴリだったのが「advanced」に移動してます。

Python Console :
http://www.blender.org/manual/editors/python_console.html
Blender Python API :
http://www.blender.org/api/blender_python_api_2_76_2/
Scripting & Extending Blender » Introduction :
http://www.blender.org/manual/advanced/scripting/introduction.html

##numpy
Houdini同様、blenderもなにもしなくてもnumpy読み込めます。

## 終了
後ろに応答しないblenderウィンドウがいらっしゃる関係か、雑にウィンドウを閉じようとすると警告されます。
`quit()`か`exit()`でちゃんと終了させてあげましょう。
（…なんか最後に一瞬Errorが出て、not found云々っぽいですが、まあ…）

# Nuke
Nuke に「**-t**」というオプションを付けて起動します。terminalのt。

例：
`"C:\Program Files\Nuke9.0v8\Nuke9.0.exe" -t`

…するとPythonインタープリタとして起動するっぽいですが、
無料体験版ではライセンス的に許可されていないようで、試せませんでした。
![nuke_licError.png](https://qiita-image-store.s3.amazonaws.com/0/102581/4e78c1e2-c5c6-30ae-705b-d7c54858b8dc.png)
…。
コマンドラインからのレンダリングも制限されているので、そりゃそうかー。です。
ということで、苦し紛れに普通にNuke上で云々してみました。

※
また、-tの後ろにPythonスクリプトファイルを与えると、それを実行してくれるようです。
`"C:\Program Files\Nuke9.0v8\Nuke9.0.exe" -t path\to\your\script.py`


## モジュール
Nukeの機能を使うためのモジュールは「**nuke**」モジュールです。
![nuke_script.png](https://qiita-image-store.s3.amazonaws.com/0/102581/d794e1ee-9cc2-1a68-c491-eedc6ecf1be9.png)
それにしても、単に`dir()`した時点ですでにグローバルになんかいろいろ置かれてます。。。

公式ドキュメント：
https://www.thefoundry.co.uk/products/nuke/developers/90/pythondevguide/command_line.html

NUKE Python Developer's Guide v9.0v8 documentation :
http://docs.thefoundry.co.uk/nuke/90/pythondevguide/index.html

# まとめ

Houdini、Nukeは、モジュールが最初から読み込まれている勢、
Maya、blenderは任意に読み込む勢、
でした。

また、
MayaとHoudiniはそのままPythonインタープリタが立ち上がるexeが用意されてます。
blenderとNukeはオプションつけることでインタープリタにもなるパターン。

sys.argvはHoudiniとblenderにはなんか入ってましたが、
言及してないMayaとNukeは`['']`（空っぽ）でした。

Mayaは、開発周りのドキュメントも日本語化に熱心です。
ドキュメントとして優秀か、誤訳はないか、というのとはまた別枠ですが、ありがたいです。

他のPython動くツールも対話モードがあるかみてみたいですね。

# おまけ
## 3dsMax
Maxにも Python API が標準で載るようになりましたが、上に書いたような対話モードではなく起動したMax上で使えます。
あとは**3dsmaxcmd.exe**ですかね。でも対話モードないのかな？あるのかな？基本的にはバッチレンダリング用途の人です。すみませんよく分かりません(笑

Executing Python scripts from the command line：
http://docs.autodesk.com/3DSMAX/16/ENU/3ds-Max-Python-API-Documentation/files/GUID-379E0B39-7F56-4764-88B6-B26090948800.htm

## ConEmu
登録しておくと便利です
![conemu.png](https://qiita-image-store.s3.amazonaws.com/0/102581/ba9036ea-42b7-7784-4abe-159bd5f0bfdc.png)

ConEmu プロジェクト日本語トップページ - OSDN：
https://osdn.jp/projects/conemu/