LuaPy_gsl 経由で使う汎用 Python サブ

2017-02-15 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-02-13)の記事「LuaPy_gsl:GSL Shell による LuaPy.dll 相当品」で書いた、
呼出側 Lua プログラムで使う Python サブを汎用化してみた。


以前(2016-08-13)の記事「LuaPy 経由で使う汎用 Python サブ」では、
  ・・・・・
  ・・・・・
  この Python プログラムには、
  “Exec”関数一つだけ。

  それは、
  受け取った文字列を、“exec”文で実行するだけ。
  受け取る文字列は配列に格納されていて、
  その配列サイズも受け取る。

  つまり、こんなコード:
  ・・・・・
  ・・・・・
と云うことで、“Sub_LuaPy_Gen.py”を作ったが、
今回、再設計した。


やはり“Exec”関数一つだけ。
だが、引数は4つ:
第1 ( s1 ):受取文字列。これを exec() で実行する。
第2 ( d1 ):受取 double データ(配列)の先頭アドレス。
第3 ( d2 ):返却 double データ(配列)の先頭アドレス。
第4 ( s2 ):返却文字列。文字列データはここに格納する。

なお、第3、第4引数に関しては、
その領域は呼出側で用意しておく。
また、Python プログラムでは、
d1、d2、s2 それぞれの領域は、DT、DV、SV で参照する。


つまり、こんなコード:
# -*- coding: utf-8 -*-
# --- Sub_LuaPy_Gen_g.py
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( s1, d1, d2, s2 ):
DT = doubleA( d1 ); DV = doubleA( d2 )
ST = ct.create_string_buffer(4097)
_ = ct.cdll.msvcrt.memcpy( ST, s1, 4096 )

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

_ = ct.cdll.msvcrt.memcpy( s2, SV, len(SV)+1 )
return 0
でしょうか。


これを使うサンプルコードについては、・・・・・

Python 2.7.x Documentation
オブジェクトプロトコル (object protocol)
で学習して、

引数をタプルで渡す PyObject_CallObject を使うよりも、
代わりに引数を個別の変数で渡す
PyObject_CallFunctionObjArgs を使った方が速いとか?

それで、
これを使ってみた:
--------------- tst_LuaPy_Gen_g.gsl
charA = |x| ffi.cast( 'char*', x )
voidA = |x| ffi.cast( 'void*', x )
Int = |x| ffi.cast( 'int32_t', x )
NULL = voidA(0)

Py = ffi.load('python27')
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 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
function PyFun( f, p0, p1, p2, p3 ) --===============
pFunc = Py.PyDict_GetItemString( pDict, charA(f) )
pA0 = Py.PyInt_FromLong( p0 )
pA1 = Py.PyInt_FromLong( p1 )
pA2 = Py.PyInt_FromLong( p2 )
pA3 = Py.PyInt_FromLong( p3 )
pValue = Py.PyObject_CallFunctionObjArgs( pFunc, pA0, pA1, pA2, pA3, NULL )
return Py.PyInt_AsLong( pValue )
end
function 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
-----------------------------------------

PyIni( 'Sub_LuaPy_Gen_g' ) -- Python 初期化

------------- インタフェース情報
DT = ffi.new( 'double[?]', 10, 50,60,70,80 )
DV = ffi.new( 'double[?]', 10 )
SV = ffi.new( 'uint8_t[?]', 4097 )

----- 以下が、Python 実行文群
ST = [[
DV[0]=DT[3]
print DV[0],DT[3]
SV='hoge'
]]
---------------------------------

PyFun( 'Exec', Int(charA(ST)), Int(DT), Int(DV), Int(SV), NULL )
PyFin() -- Python ファイナライズ
print( DV[0], DV[1] )
print( ffi.string( SV ) )
_ = io.read(1)
こんな感じ。

実行出来た。


でも、前半の宣言部分が多すぎるナ。
モジュール化を考えよう。


本日はここまで。


LuaPy_gsl 学習は続く。


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


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

コメントの投稿

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

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



おきてがみ

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