OSXのBlenderでctypesを試した
背景
2015年になってようやく、Blenderの中のPythonで3DCGを作ることが少しずつ出来てきた。
Pythonではctypesで各プラットフォームネイティブなライブラリを比較的簡単に呼び出せることを以前から知っており、この応用で、blenderにmrubyが組み込めるんじゃなかろうか?ということを実践する第一段階が今回の記事。
シンプルなCのコードをBlenderから呼び出せるか
まずは、Blenderからctypesが使えるかを確認する。
Cソース
sapm.c
#include <stdio.h> #include <assert.h> int spam_hello(char *name) { assert(name != NULL); return printf("hello %s\n", name); }
ビルド
gcc -shared -fPIC sapm.c -o sapm.dylib
Pythonコード
sapm.py
from ctypes import * class SpamError(Exception): pass class Spam: c_spam_module = CDLL('./sapm.dylib') c_spam_hello_func_type = CFUNCTYPE(c_int, c_char_p) c_spam_hello_func = cast(c_spam_module.spam_hello, c_spam_hello_func_type) @classmethod def hello(cls, name): if name == None or not isinstance(name, str): raise SpamError('invalid argument') ret = cls.c_spam_hello_func(create_string_buffer(name.encode('ascii'))) print ('c_spam_hello_func returned:', ret) if __name__ == '__main__': Spam.hello('there')
動かす
まとめ
BlenderはPython3なので、python,ctypesでwebを検索して出てくるコードだとPython2向けのものがまだまだ多いようで、printに括弧を付ける他にも、Python3での文字列周りの変更の影響でこれに対応したコードにする必要がある。
今回の記事書く際にもこれにハマった。
Link
関連記事