LuaPy.dll 改訂

2016-07-04 :  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-26)の記事「LuaPy.dll 作成
で書いた、初版“LuaPy”即ち“LuaPy_0.dll”を機能拡張し、
“LuaPy_1.dll”を作った。

主な変更ポイントは、

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

だったが、・・・・・

“LuaPy_1.dll”には、
“PyIni”“PyFun”“PyFin”と3つの関数がある。
それぞれのプロトタイプは:
int  PyIni( char* m );
int PyFun( char* f, int s, void* p );
int PyFin( );

最初に1回、“PyIni”で、呼び出す Python プログラムを指定しておき、
必要な回数、“PyFun”で関数を指定して呼び出し、
最後に、“PyFin”で、後処理を行う。

ここで、“PyFun”に、整数型の引数を ( おまけで ) 追加した。

この機能拡張は、
Python 内部でグローバルな変数を許す様にしたことにある。


動作確認として、以下のテストプログラムを作った。

呼び出す Lua ファイルは“test_LuaPy_1.gsl”とし、
“Sub_LuaPy_1.py”と云うPythonファイル内で、
“fun”関数と“fun2”関数を定義する。
・・・ グローバルな変数として、Python プログラム内に、変数 x を作った。
--------------- test_LuaPy_1.gsl ------------------
charA = |x| ffi.cast( 'char*', x )

LuaPy = ffi.load('LuaPy_1') -- dll 読み込み
ffi.cdef[[
int PyIni( char* ); // Pyファイル名
int PyFun( char*, int, void* ); // 関数名、Stage、領域
int PyFin( ); // Pyファイナライズ
]]
p = ffi.new( 'int32_t[2]' )

print( LuaPy.PyIni( charA('Sub_LuaPy_1') ) ) -- Python / ファイル 初期化

p[0]=5
print( LuaPy.PyFun( charA('fun'), 0, p ) ) -- 関数指定で呼び出し ステージ
print( LuaPy.PyFun( charA('fun'), 1, p ) ) -- 関数指定で呼び出し ステージ

p[0]=20
print( LuaPy.PyFun( charA('fun2'), 0, p ) ) -- 関数指定で呼び出し ステージ
print( LuaPy.PyFun( charA('fun2'), 1, p ) ) -- 関数指定で呼び出し ステージ

print( LuaPy.PyFin( ) ) -- Python ファイナライズ
#============== Sub_LuaPy_1.py ====================
import ctypes as ct

x = 10

def fun( s, p ):
global x
IT = ct.cast( p, ct.POINTER(ct.c_long) )
if s==0:
x = x + IT[0]
else:
x = x + IT[0]*2
return x

def fun2( s, p ):
global x
IT = ct.cast( p, ct.POINTER(ct.c_long) )
if s==0:
x = x + IT[0]+1
else:
x = x + IT[0]*2+1
return x

動作確認OK。

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

PyObject *pName, *pModule, *pDict, *pFunc, *pArgs, *pValue;
int z;

DLLExport int PyIni( char* m ){
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
return 0;
}
DLLExport int PyFun( char* f, int s, void* p ){
pFunc = PyDict_GetItemString(pDict, f ); // pFunc is also a borrowed reference
pArgs = PyTuple_New(2);
pValue=PyInt_FromLong(s);
PyTuple_SetItem( pArgs, 0, pValue );
pValue=PyInt_FromLong((int)p);
PyTuple_SetItem( pArgs, 1, pValue );
pValue = PyObject_CallObject( pFunc, pArgs );
z = PyInt_AsLong(pValue);
return z;
}
DLLExport int PyFin( ){
Py_DECREF(pArgs);
Py_DECREF(pValue);
Py_DECREF(pDict);
Py_DECREF(pModule); // Clean up
Py_DECREF(pName);
Py_Finalize(); // Finish the Python Interpreter
return 0;
}


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


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

コメントの投稿

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

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



おきてがみ

最新記事
カレンダー
02 | 2017/03 | 03
- - - 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
ブックマーク