LuaPy.dll 作成

2016-05-26 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
7、2、0、0、1、 0、0、0、0、0(40)で、換算ポイント 88pt 。
「Firefox」5位アップ。「化学業界」「硝子業界」「FM COCOLO」「e-radio」、
「グルコサミン」bg値変動。「Perl」「C言語」「Python」「FM青森」変化無し。
・-・ - -・

さて、本文。

以前(2016-05-20)の記事「Lua から Python 関数の呼出し出来た
その後、
あれこれ学習し、多少はまとも(?)な設計した。


GSL Shell スクリプトで、Python 関数を呼び出すための、
橋渡しモジュールを設計・製造した。
名付けてLuaPy(LuaPy.dll)


“LuaPy.dll”には、“inter”関数が1つだけある。

プロトタイプ宣言は:
int  inter( char* PyName, char* PyFunc, void* IT );
で、
“PyName”は、呼び出す Python プログラム ( .py )
“PyFunc”は、その中で宣言されている関数 ( 任意な名前 )
“IT”配列は、受け渡し情報領域 ( 整数型を想定 )
戻り値は、整数型とする。( リターンコード ? )

Lua ~ Python 受け渡し情報には、
実数型や、文字列型も必要だが、
その場合は、
別途しかるべき領域を確保し、
それへのポインタを(整数型として) IT 配列に格納する。


これを使って、Lua から、Python 関数を呼び出す最初の例:

機能的には、
 IT[0] と IT[1] を加算して、IT[2] に格納する。
と云う大して役に立たない(?)もの。

呼び出す Lua ファイルは“TestMain.gsl”とし、
“Sub.py”と云うPythonファイルで、“Fun”関数を定義する。

--------------- TestMain.gsl ------------------
charA = |x| ffi.cast( 'char*', x )
voidA = |x| ffi.cast( 'void*', x )
LuaPy = ffi.load( 'LuaPy' )
ffi.cdef[[
int inter( char*, char*, void* );
]]
IT = ffi.new( 'int32_t[3]' )
IT[0] = 99 -- 試し
IT[1] = 1 -- 試し
_ = LuaPy.inter( charA('Sub'), charA('Fun'), voidA(IT) )
print( IT[2] )
_ = io.read(1)

#============== Sub.py ====================
import ctypes as ct
def Fun( p ):
IT = ct.cast( p, ct.POINTER( ct.c_long ) )
IT[2] = IT[0] + IT[1] #===== これが関数の機能
return 0

以上の2本を作って、
「TestMain.gsl」をダブルクリックすると、・・・

  100

と表示して「Enter」キー入力待ちの状態に成る。


メデタシめでたし。完成???


因みに、“LuaPy.dll”は???
/* ===================== LuaPy.c =========================== */
/* コンパイルは、cl /LD /FeLuaPy.dll LuaPy.c User32.lib */
#include
#define DLLExport __declspec ( dllexport )

DLLExport int inter( char* m, char* f, void* p ){
PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
int z;
Py_Initialize(); // Initialize the Python Interpreter
pName = PyString_FromString( m ); // Build the name object
pModule = PyImport_Import(pName); // Load the module object
pDict = PyModule_GetDict(pModule); // pDict is a borrowed reference
pFunc = PyDict_GetItemString( pDict, f ); // pFunc is also a borrowed reference
pArgs = PyTuple_New(1);
pValue=PyInt_FromLong( (int)p );
PyTuple_SetItem( pArgs, 0, pValue );
pValue = PyObject_CallObject( pFunc, pArgs ); // Python 呼び出し
Py_DECREF(pArgs);
z = PyInt_AsLong(pValue);
Py_DECREF(pValue);
Py_DECREF(pModule); // Clean up
Py_DECREF(pName);
Py_Finalize(); // Finish the Python Interpreter
return z;
}
です。

後は、
実数型データや、バイトデータ配列、
そして、文字列型データの扱い。


更なる 学習だ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


160414
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク