Origin Cでは、直接Pythonを呼び出す方法はありません。Origin C内でPythonコードを再利用したい場合、まずDLLにPython関数をラップした後、関数をDLLでOrigin Cコードに公開することをお勧めします。この章の以下の節では、手順を追ってこれを説明するサンプルを示します。
Notes: Origin 2015からpythonをOriginで実行でき(コマンドラインと.pyファイルの両方をサポート)、PyOrigin モジュールを使用してPythonからOriginにアクセス可能です。詳細は、Python.chm を確認してください。 |
このサンプルは以下の環境で行ったものです。
以下で定義されるPython関数をOrigin Cで再利用します。
def SayHello(): print("Welcome to use Python in your Origin C programs!")#actually this string will not show in Origin C return 12345 def Add(a, b): return a + b def Sub(a, b): return a - b def Mult(a, b): return a * b def Div(a, b): return a / b def Mod(a, b): return a % b
python -m py_compile myLib.py
Note: 32-bit DLLを作成したので、32-bit版のOriginで使用できます。
#ifndef _OPYTHON_H_ #define _OPYTHON_H_ #ifdef _OPYTHON_CPP_ #define OP_API __declspec(dllexport) //use in VC #else #define OP_API //OCで使用 #pragma dll(OPython) //この行は重要です。OCで使用するとき、Originは、このDLLを検索することで関数本体を探します。Note: dllで生成されるOPythonDLLは拡張名なしです。 #endif OP_API int PY_SayHello(); OP_API float PY_Add(float a, float b); OP_API float PY_Sub(float a, float b); OP_API float PY_Mult(float a, float b); OP_API float PY_Div(float a, float b); OP_API float PY_Mod(float a, float b); #endif //_OPYTHON_H_
#include "stdafx.h" #define _OPYTHON_CPP_ //use this macro to identify whether OPython.h is included in VC(when create the DLL) or OC(when use the DLL) #include "OPython.h" #include <Python.h> class PythonManager { public: PythonManager(); //init python environment ~PythonManager(); //clean python environment }; PythonManager::PythonManager() { Py_Initialize(); } PythonManager::~PythonManager() { Py_Finalize(); } OP_API int PY_SayHello() { PythonManager pm; PyObject* pModule; PyObject* pFunc; //call python function, with no parameters int nRet = 0; pModule = PyImport_ImportModule("myLib"); if ( NULL == pModule ) return nRet; pFunc = PyObject_GetAttrString(pModule, "SayHello"); if ( pFunc ) { PyObject* pRet = NULL; pRet = PyEval_CallObject(pFunc, NULL); PyArg_Parse(pRet, "i", &nRet); } return nRet; } static float _call_float_float(LPCSTR lpcszFunc, float a, float b) { PythonManager pm; PyObject* pModule; PyObject* pFunc; //call python function, with multiple parameters float fRet = 0; pModule = PyImport_ImportModule("myLib"); if ( NULL == pModule ) return fRet; pFunc = PyObject_GetAttrString(pModule, lpcszFunc); if ( pFunc ) { PyObject* pParams = NULL; pParams = PyTuple_New(2); //create tuple to put parameters PyTuple_SetItem(pParams, 0, Py_BuildValue("f", a)); PyTuple_SetItem(pParams, 1, Py_BuildValue("f", b)); PyObject* pRet = NULL; pRet = PyEval_CallObject(pFunc, pParams); PyArg_Parse(pRet, "f", &fRet); } return fRet; } OP_API float PY_Add(float a, float b) { return _call_float_float("Add", a, b); } OP_API float PY_Sub(float a, float b) { return _call_float_float("Sub", a, b); } OP_API float PY_Mult(float a, float b) { return _call_float_float("Mult", a, b); } OP_API float PY_Div(float a, float b) { return _call_float_float("Div", a, b); } OP_API float PY_Mod(float a, float b) { return _call_float_float("Mod", a, b); }
LIBRARY "OPython"
EXPORTS
;Functions to export
PY_SayHello
PY_Add
PY_Sub
PY_Mult
PY_Div
PY_Mod
以下のコードは、上で作成したDLLをOrigin Cで使用する方法を示します。
#include <Origin.h> #include "OPython.h" //このヘッダファイルをインクルードすること int test_Python() { int nRet = PY_SayHello(); float c = PY_Add(2, 4); float d = PY_Div(2, 3); return 0; }
test_Python;
このページのサンプルでは、Pythonで記述された関数を再利用するシンプルなDLLを作成します。大量データをPython で処理してOriginとPython間でデータを交換したい場合、バッファが推奨されます。Originの列からデータを渡すとき、データを持つベクターを、OriginCからパラメータをポインタ(double* pBuffer) で受けるDLL関数に渡します。このバッファに基づく変更はすべて即座にOrigin C内のベクターに反映されます。