Python2.7 のモジュールをコマンドラインからたたけるようにするスクリプト ModuleCaller.py を書いてみました。
ソースコードは Gist で公開しているのでそちらを参照して下さい。
Gist: ModuleCaller.py
以下のドキュメントは ModuleCaller.py Version 0.X に対応しています。
目次
はじめに
同じようなことを「 Python3 から Python2.7 モジュールの関数をコマンド (func_caller.py) 経由で呼ぶ 」でやってますが、今回はより汎用的にモジュールを呼び出せるようにしてます。
関数の引数も戻り値も JSON で表現できるものであれば、大抵のモジュールを利用できる (はず) です。
基本的な使い方
$ ./ModuleCaller.py datetime '[["date", [2014, 9, 10]], ["strftime", ["%c"]]]'
"Wed Sep 10 00:00:00 2014"
datetime モジュールの date(2014, 9, 10) インスタンスを作成して strftime(“%c”) 関数を呼び出しています。
以下の Python2.7 コードと同等です。
$ python2.7
>>> import json, datetime
>>> print(json.dumps(datetime.date(2014, 9, 10).strftime("%c")))
"Wed Sep 10 00:00:00 2014"
「 [[“date”, [2014, 9, 10]], [“strftime”, [“%c”]]] 」 の部分は JSON で記述します。Python コードではないので、文字列をダブルクォート 「 ” 」 でなく、シングルクォート 「 ‘ 」 でくくると以下のようにエラーになります。
$ ./ModuleCaller.py datetime "[['date', [2014, 9, 10]], ['strftime', ['%c']]]"
... snip ...
ValueError: No JSON object could be decoded
引数名を指定するときは JSON オブジェクト (Python でいうところの辞書) を使います
$ ./ModuleCaller.py datetime '[["date", {"year": 2014, "month": 9, "day": 10}], ["strftime", {"format": "%c"}]]'
"Wed Sep 10 00:00:00 2014"
以下の Python2.7 コードと同等です。
$ python2.7
>>> import json, datetime
>>> print(json.dumps(datetime.date(year=2014, month=9, day=10).strftime(format="%c")))
"Wed Sep 10 00:00:00 2014"
関数をたたくだけでなく、定数の値を取得することもできます
$ ./ModuleCaller.py datetime '["MAXYEAR"]'
9999
以下の Python2.7 コードと同等です。
$ python2.7
>>> import json, datetime
>>> print(json.dumps(datetime.MAXYEAR))
9999
同様にインスタンスのアトリビュートを取得することもできます。
$ ./ModuleCaller.py datetime '[["date", [2014, 9, 10]], "year"]'
2014
以下の Python2.7 コードと同等です。
$ python2.7
>>> import json, datetime
>>> print(json.dumps(datetime.date(2014, 9, 10).year))
2014
引数に何も渡さない場合は空オブジェクト又は空リストを渡します
引数に何も渡さない場合は「 [“listDomainsID”, {}] 」のように空オブジェクトを渡します。
$ ./ModuleCaller.py libvirt '[["open", ["qemu:///system"]], ["listDomainsID", {}]]'
[129, 131, 130, 128]
以下の Python2.7 コードと同等です。
$ python2.7
>>> import json, libvirt
>>> print(json.dumps(libvirt.open('qemu:///system').listDomainsID()))
[129, 131, 130, 128]
又は「 [“listDomainsID”, []] 」というように空リストを渡しても良いです。:
$ ./ModuleCaller.py libvirt '[["open", ["qemu:///system"]], ["listDomainsID", []]]'
[129, 131, 130, 128]
どこまでも連鎖的に呼び出していくことができます
libvirt モジュールの open(‘qemu:///system’) 関数で得られたインスタンスの lookupByID(id=131) 関数で得られたインスタンスの name() 関数を呼び出す。。。というようにどこまでも連鎖的に呼び出していくことができます。
$ ./ModuleCaller.py libvirt '[["open", ["qemu:///system"]], ["lookupByID", {"id": 131}], ["name", {}]]'
"TestGuest"
以下の Python2.7 コードと同等です。
$ python2.7
>>> import json, libvirt
>>> print(json.dumps(libvirt.open('qemu:///system').lookupByID(id=131).name()))
"TestGuest"
ビルトイン関数を呼び出すこともできます
ビルトイン関数 を呼び出すこともできます。
$ ./ModuleCaller.py __builtin__ '[["pow", [10, 2]]]'
100
以下の Python2.7 コードと同等です。
$ python2.7
>>> import json
>>> print(json.dumps(pow(10, 2)))
100
0 件のコメント:
コメントを投稿