クローズド・コードなのか?
前回
知りたかった情報
以下のようなgimp
モジュールにあるクラス。
gimp.GroupLayer gimp.Layer gimp.Image
手順
sudo apt -y install gimp sudo apt -y install gimp-python
dpkg -L gimp-python
/. /usr /usr/lib /usr/lib/gimp /usr/lib/gimp/2.0 /usr/lib/gimp/2.0/environ /usr/lib/gimp/2.0/environ/pygimp.env /usr/lib/gimp/2.0/interpreters /usr/lib/gimp/2.0/interpreters/pygimp.interp /usr/lib/gimp/2.0/plug-ins /usr/lib/gimp/2.0/plug-ins/colorxhtml /usr/lib/gimp/2.0/plug-ins/colorxhtml/colorxhtml.py /usr/lib/gimp/2.0/plug-ins/file-openraster /usr/lib/gimp/2.0/plug-ins/file-openraster/file-openraster.py /usr/lib/gimp/2.0/plug-ins/foggify /usr/lib/gimp/2.0/plug-ins/foggify/foggify.py /usr/lib/gimp/2.0/plug-ins/gradients-save-as-css /usr/lib/gimp/2.0/plug-ins/gradients-save-as-css/gradients-save-as-css.py /usr/lib/gimp/2.0/plug-ins/histogram-export /usr/lib/gimp/2.0/plug-ins/histogram-export/histogram-export.py /usr/lib/gimp/2.0/plug-ins/palette-offset /usr/lib/gimp/2.0/plug-ins/palette-offset/palette-offset.py /usr/lib/gimp/2.0/plug-ins/palette-sort /usr/lib/gimp/2.0/plug-ins/palette-sort/palette-sort.py /usr/lib/gimp/2.0/plug-ins/palette-to-gradient /usr/lib/gimp/2.0/plug-ins/palette-to-gradient/palette-to-gradient.py /usr/lib/gimp/2.0/plug-ins/py-slice /usr/lib/gimp/2.0/plug-ins/py-slice/py-slice.py /usr/lib/gimp/2.0/plug-ins/python-console /usr/lib/gimp/2.0/plug-ins/python-console/pyconsole.py /usr/lib/gimp/2.0/plug-ins/python-console/python-console.py /usr/lib/gimp/2.0/plug-ins/python-eval /usr/lib/gimp/2.0/plug-ins/python-eval/python-eval.py /usr/lib/gimp/2.0/python /usr/lib/gimp/2.0/python/_gimpenums.so /usr/lib/gimp/2.0/python/_gimpui.so /usr/lib/gimp/2.0/python/gimp.so /usr/lib/gimp/2.0/python/gimpcolor.so /usr/lib/gimp/2.0/python/gimpenums.py /usr/lib/gimp/2.0/python/gimpfu.py /usr/lib/gimp/2.0/python/gimpplugin.py /usr/lib/gimp/2.0/python/gimpshelf.py /usr/lib/gimp/2.0/python/gimpthumb.so /usr/lib/gimp/2.0/python/gimpui.py /usr/lib/gimp/2.0/python/pygimp-logo.png /usr/share /usr/share/doc /usr/share/doc/gimp-python /usr/share/doc/gimp-python/changelog.Debian.gz /usr/share/doc/gimp-python/changelog.gz /usr/share/doc/gimp-python/copyright /usr/share/python /usr/share/python/runtime.d /usr/share/python/runtime.d/gimp-python.rtupdate
gimp.so
がそれと思われる。だが、.so
はライブラリファイル。.py
ならコードが見れたのに……。
/usr/lib/gimp/2.0/python/gimp.so
gimpfu.py
はfrom gimpfu import *
して利用する。中身をみてみたら、pdb
を作っているところがあった。
import gimp import gimpcolor from gimpenums import * pdb = gimp.pdb
やはりgimp.so
がキモらしい。そいつのコードを見たい!
逆アセンブリ
objdump -d /usr/lib/gimp/2.0/python/gimp.so > /tmp/work/dump.txt
000070d8 <gimp_layer_group_new@plt>: 70d8: e28fc600 add ip, pc, #0, 12 70dc: e28cca27 add ip, ip, #159744 ; 0x27000 70e0: e5bcf888 ldr pc, [ip, #2184]! ; 0x888
逆アセンブリしてもPythonのクラスらしきものはなかった。so
の中にあるのはすべてC言語の関数なのだろう。gimp.GroupLayer
クラスはどこで定義されてるの?
ほかの.py
コードもいくつか覗いてみたが見つからなかった。
GitHub
extern PyTypeObject PyGimpGroupLayer_Type;
#define pygimp_layer__group_check(v) (PyObject_TypeCheck(v, &PyGimpGroupLayer_Type))
PyObject *pygimp_group_layer_new(gint32 ID);
たぶんC言語からPythonに使えるようにしている部分なのだとおもう。
gimp.GroupLayer
クラスを作り、それに対応する関数pygimp_group_layer_new
を割り当てているのだろう。でもたしか実際に使って確認したらgimp.GroupLayer(親元gimp.Image, 自分の表示名)
だったはず。
で? gimp.GroupLayer
のプロパティとかメソッドの引数はどうやったらわかるの?
所感
APIがわからない。どうやって調べるの? 特にgimp.GroupLayer()
についての情報がない。
ソースコードは以下にあるが、そこのどこにpython-fuのgimp.GroupLayer()
が定義されているのか。そもそも.so
ファイルしかないのか。
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release
- GIMP 2.10.8
$ uname -a Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux