Python埋め込みD
すべての埋め込みを検討した.Pythonを埋め込むのがいいと気づきました.試してみます.
DでPythonの拡張を書いて、すでにpyDがあって、とても良くて、効率もとても高くて、http://pyd.dsource.org
PythonをDに埋め込むと、RawのC-APIしか使えなくなります.ここではpyDのPythonインターフェースファイルを使いました.
python.dとpython 25_digital mars.libは本機にPythoon 2.5を設置しました.
1.簡単なハイレベル埋め込み:Pythonのスクリプトを実行することです.
2.低レベル埋め込み:Cの例を修正し、DでPython関数を呼び出し、値を返します.pythonスクリプトと呼び出しはコメントに書いてあります.
Pythonの変数を適切なタイミングで放出することが肝要である.自分でも簡単なパッケージを書きました.比較すると、一番簡単なのはやはりMiniDの埋め込みです.次はLua、Pythonのほうが複雑です.Pythonの利点は、クラスが豊富で、ほとんど何が必要ですか?
DでPythonの拡張を書いて、すでにpyDがあって、とても良くて、効率もとても高くて、http://pyd.dsource.org
PythonをDに埋め込むと、RawのC-APIしか使えなくなります.ここではpyDのPythonインターフェースファイルを使いました.
python.dとpython 25_digital mars.libは本機にPythoon 2.5を設置しました.
1.簡単なハイレベル埋め込み:Pythonのスクリプトを実行することです.
import python;
void main()
{
Py_Initialize();
PyRun_SimpleString("from time import time,ctime
"
"print('Today is:',ctime(time()))
");
Py_Finalize();
}
2.低レベル埋め込み:Cの例を修正し、DでPython関数を呼び出し、値を返します.pythonスクリプトと呼び出しはコメントに書いてあります.
import python;
import std.stdio,std.string,std.c.string;
//call: t sm mw 2 3
/*
'''sm.py'''
def mw(a,b):
print 'Will compute',a,'times',b
c=0
for i in range(0,a):
c=c+b
return c
*/
void main(char[][] argv)
{
PyObject * pName,pModule,pDict,pFunc;
PyObject *pArgs, pValue;
int i,argc;
argc = argv.length;
if (argc < 3) {
printf("Usage: call pythonfile funcname [args]
");
return 1;
}
printf("args:%d
",argc);
Py_Initialize();
pName = PyString_FromString( toStringz(argv[1]) );
/* Error checking of pName left out */
pModule = PyImport_Import(pName);
Py_DECREF(pName);
if (pModule != null) {
pFunc = PyObject_GetAttrString(pModule, toStringz(argv[2]));
/* pFunc is a new reference */
if (pFunc && PyCallable_Check(pFunc)) {
pArgs = PyTuple_New(argc - 3);
//set args
for (i = 0; i < argc - 3; ++i) {
pValue = PyInt_FromLong(atoi(argv[i + 3]));
if (!pValue) {
Py_DECREF(pArgs);
Py_DECREF(pModule);
printf("Cannot convert argument
");
return 1;
}
/* pValue reference stolen here: */
PyTuple_SetItem(pArgs, i, pValue);
}
//call function
pValue = PyObject_CallObject(pFunc, pArgs);
Py_DECREF(pArgs); //release args
if (pValue != null) {
printf("Result of call: %ld
", PyInt_AsLong(pValue));
Py_DECREF(pValue); //release return
}
else {
Py_DECREF(pFunc); //
Py_DECREF(pModule);
PyErr_Print();
printf("Call failed/n");
return 1;
}
}
else {
if (PyErr_Occurred())
PyErr_Print();
printf( "Cannot find function \"%s\"
", argv[2]);
}
Py_XDECREF(pFunc);
Py_DECREF(pModule);
}
else {
PyErr_Print();
printf("Failed to load \"%s\"
", argv[1]);
return 1;
}
Py_Finalize();
return 0;
}
Pythonの変数を適切なタイミングで放出することが肝要である.自分でも簡単なパッケージを書きました.比較すると、一番簡単なのはやはりMiniDの埋め込みです.次はLua、Pythonのほうが複雑です.Pythonの利点は、クラスが豊富で、ほとんど何が必要ですか?