LuaPy_GSL モジュール化

2017-02-17 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-02-15)の記事「LuaPy_gsl 経由で使う汎用 Python サブ」では、

呼出側 Lua プログラムで使う Python サブを汎用化してみた。

一応の完成?を見たので、
LuaPy_GSL をモジュール化した。
(LuaPy_gsl を LuaPy_GSL に改めた)


その前に、Lua-Python インタフェース を見直した。

呼ばれる Python サブを SUB_LuaPy_GSL_Gen.py とし、
引数を3つにした。
1つだけ定義されている関数は変わらず Exec のまま。

以前(2016-07-04)の記事「LuaPy.dll 改訂」で書いた“LuaPy_1.dll”に相当する
Lua モジュールは、LuaPy_GSL.lua とした。


これで、任意の GSL Shell プログラムでは、
LuaPy_GSL.lua 経由で、SUB_LuaPy_GSL_Gen.py を呼ぶ。


3つの引数について:

第1(IT):整数(int)型データの配列
第2(ST):実行したい Python ソーステキスト文字列データ
第3(SV):Python 実行結果の文字列データ格納領域

そして、
前回は固定(最大文字列)サイズだった、ST の文字列長は、
可変長として、IT[0] で受け渡す。
IT[1]~ は、直接 整数データ配列とするか、
整数/実数 任意のデータ配列へのポインタ(これも整数)とする。


そうすると、SUB_LuaPy_GSL_Gen.py は:
# -*- coding: utf-8 -*-

import sys ##### この部分は Tkinter つまり matplotlib 用
w=sys.path
for k in range(len(w)):
if w[k].find('Lib')>0: ww=w[k]; break
sys.path.append(ww+'/lib-tk')
# ----------------------------------
import ctypes as ct
import numpy as np

def IntA(x):
return ct.cast( x, ct.POINTER(ct.c_long) )
def doubleA(x):
return ct.cast( x, ct.POINTER(ct.c_double) )
def np_data( x ):
return ct.cast( id(x), ct.POINTER(ct.c_long) ) [2]
####################################
def Exec( IT_, ST_, SV_ ):
IT = IntA(IT_); leng = IT[0]
ST = ct.create_string_buffer(leng)
_ = ct.cdll.msvcrt.memcpy( ST, ST_, leng )

SV='nil'; exec( ST.value )

_ = ct.cdll.msvcrt.memcpy( SV_, SV, len(SV)+1 )
return 0
でしょうか。
最初の def 3つは、汎用で定義しておく。

それから、LuaPy_GSL.lua は:
local Py = { }                --- LuaPy_GSL.lua
local py = ffi.load( 'python27' )
-----------------------------------
charA = |x| ffi.cast( 'char*', x )
voidA = |x| ffi.cast( 'void*', x )
Int = |x| ffi.cast( 'int32_t', x )
NULL = voidA(0)

ffi.cdef[[
void Py_Initialize( void );
void* PyString_FromString( char* );
void* PyImport_Import( void* );
void* PyModule_GetDict( void* );
void* PyDict_GetItemString( void*, char* );
void* PyTuple_New( int );
void* PyInt_FromLong( int );
void PyTuple_SetItem( void*, int, void* );
// void* PyObject_CallObject( void*, void* ); ----- これを、
void* PyObject_CallFunctionObjArgs( void*, ... ); // これに。
int PyInt_AsLong( void* );
void Py_Finalize( void );
]]
----------------------------------------------------
function Py.PyIni( m ) -- int PyIni( char* m )
py.Py_Initialize()
pName = py.PyString_FromString( charA(m) )
pModule = py.PyImport_Import( pName )
pDict = py.PyModule_GetDict( pModule )
return 0;
end
------ 関数名、IT配列、str、戻りstr(要確保)
function Py.PyFun( fun, IT_, ST_, SV_ )
pFunc = py.PyDict_GetItemString( pDict, charA(fun) )
pA0 = py.PyInt_FromLong( Int(IT_) )
pA1 = py.PyInt_FromLong( Int(charA(ST_)) )
pA2 = py.PyInt_FromLong( Int(SV_) )
pValue = py.PyObject_CallFunctionObjArgs( pFunc, pA0, pA1, pA2, NULL )
return py.PyInt_AsLong( pValue )
end
function Py.PyFin( ) -- int PyFin( )
-- py.Py_DECREF( pArgs ) -- Py_DECREF はマクロ!使えない。
-- py.Py_DECREF( pValue ) -- 無くてもイイのかな?
-- py.Py_DECREF( pDict )
-- py.Py_DECREF( pModule )
-- py.Py_DECREF( pName )
py.Py_Finalize()
return 0;
end

return Py
で行ける?


早速、テストプログラムを1本作った:
------------------------ test_use_LuaPy_GSL.gsl

local Py = require'LuaPy_GSL'

-----------------------------------------
-----------------------------------------

Py.PyIni( 'SUB_LuaPy_GSL_Gen' ) -- Python 初期化

--------------- インタフェース情報
IT = ffi.new( 'int32_t[9]' )
DT = ffi.new( 'double[?]', 10, 50.5, 60.5, 70.5, 80.5 )
DV = ffi.new( 'double[?]', 10 )
SV = ffi.new( 'uint8_t[?]', 4097 )

----- 以下が、実行文群
ST = [[
DT=doubleA(IT[1]); DV=doubleA(IT[2])
DV[0]=DT[3]
print DV[0],DT[3]
SV='HOGE'+str(DV[0])
]]
------------------------------------
IT[0]=#ST+1; IT[1]=Int(DT); IT[2]=Int(DV)
Py.PyFun( 'Exec', IT, ST, SV )
Py.PyFin() -- Python ファイナライズ

print( DV[0],DV[1] )
print( ffi.string( SV ) )
_ = io.read(1)
これで、
一応のテストOK?


さて、
'python27.lib'、'LuaPy_GSL.lua'、'SUB_LuaPy_GSL_Gen.py'
は、何処に置いておけばイイのか?
3つともメインの'test_use_LuaPy_GSL.gsl'と同じ処に置けばイイけど。

これは、継続学習ダ。


本日はここまで。


LuaPy_GSL 学習は続く。


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


170122,28
関連記事
スポンサーサイト

コメントの投稿

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

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



おきてがみ

最新記事
カレンダー
08 | 2017/09 | 10
- - - - - 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
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

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

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


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

Google Analytics
ブックマーク