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のスクリプトを実行することです.
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の利点は、クラスが豊富で、ほとんど何が必要ですか?