北湖区网站建设公司,无锡网站制作建设,网站链接优化怎么做,如何衡量网站的价值环境#xff1a;
phyton版本#xff1a;3.10
VS版本#xff1a;VS2017 包含文件头#xff1a;Python\Python310\include 包含库文件#xff1a;Python\Python310\libs 程序运行期间#xff0c;以下函数只需要调用一次即可#xff0c;重复调用会导致崩溃
void Initial…环境
phyton版本3.10
VS版本VS2017 包含文件头Python\Python310\include 包含库文件Python\Python310\libs 程序运行期间以下函数只需要调用一次即可重复调用会导致崩溃
void Initialize(); void Finalize();
“C_Test.py”需要拷贝程序运行所有的目录。 下载https://download.csdn.net/download/luo_sen/88094131 PythonHelper.h
#pragma once
#includestring
using namespace std;
/*
phyton版本3.10
包含文件头Python\Python310\include
包含库文件Python\Python310\libs
*/
// https://docs.python.org/3/c-api/arg.html
/*
b (int) [unsigned char]
Convert a nonnegative Python integer to an unsigned tiny int, stored in a C unsigned char.B (int) [unsigned char]
Convert a Python integer to a tiny int without overflow checking, stored in a C unsigned char.h (int) [short int]
Convert a Python integer to a C short int.H (int) [unsigned short int]
Convert a Python integer to a C unsigned short int, without overflow checking.i (int) [int]
Convert a Python integer to a plain C int.I (int) [unsigned int]
Convert a Python integer to a C unsigned int, without overflow checking.l (int) [long int]
Convert a Python integer to a C long int.k (int) [unsigned long]
Convert a Python integer to a C unsigned long without overflow checking.L (int) [long long]
Convert a Python integer to a C long long.K (int) [unsigned long long]
Convert a Python integer to a C unsigned long long without overflow checking.n (int) [Py_ssize_t]
Convert a Python integer to a C Py_ssize_t.c (bytes or bytearray of length 1) [char]
Convert a Python byte, represented as a bytes or bytearray object of length 1, to a C char.Changed in version 3.3: Allow bytearray objects.C (str of length 1) [int]
Convert a Python character, represented as a str object of length 1, to a C int.f (float) [float]
Convert a Python floating point number to a C float.d (float) [double]
Convert a Python floating point number to a C double.D (complex) [Py_complex]
Convert a Python complex number to a C Py_complex structure.
*/#define PYTHON_FILE_NAME _T(C_Test)extern C
{
#include Python.h
}class CPythonHelper
{public:void Initialize();void Finalize();PyObject* GetPyFunc(CString strModuleName, CString strFuncName); PyObject* RunPyFunc(CString strModuleName, CString strFuncName, PyObject *pArgs);int PyTupleSetItem(PyObject *, Py_ssize_t, PyObject *);CString PyObjectToCString(PyObject *pPyObj);int PyObjectToInt(PyObject *pPyObj);double PyObjectToFloat(PyObject *pPyObj);int PyObjectToFloatArray(PyObject *pPyObj, CArraydouble, double szData);PyObject* IntToPyObject(int data);PyObject* FloatToPyObject(double data);PyObject* CStringToPyObject(CString data);PyObject* FloatArrayToPyObject(CArraydouble, double szData);PyObject* CreateArgs(int size);protected:string UTF8_To_string(const std::string str);string string_To_UTF8(const std::string str);string CStringToPyString(CString text);PyObject* GetPyFunc(char* pModuleName, char* pFuncName);PyObject* RunPyFunc(char* pModuleName, char* pFuncName, PyObject *pArgs);};
PythonHelper.cpp
#include pch.h
#include PythonHelper.hstd::string CPythonHelper::UTF8_To_string(const std::string str)
{int nwLen MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);wchar_t * pwBuf new wchar_t[nwLen 1];//一定要加1不然会出现尾巴 memset(pwBuf, 0, nwLen * 2 2);MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);int nLen WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);char * pBuf new char[nLen 1];memset(pBuf, 0, nLen 1);WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);std::string retStr pBuf;delete[]pBuf;delete[]pwBuf;pBuf NULL;pwBuf NULL;return retStr;
}
std::string CPythonHelper::string_To_UTF8(const std::string str)
{int nwLen ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);wchar_t * pwBuf new wchar_t[nwLen 1];//一定要加1不然会出现尾巴 ZeroMemory(pwBuf, nwLen * 2 2);::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen);int nLen ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL);char * pBuf new char[nLen 1];ZeroMemory(pBuf, nLen 1);::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);std::string retStr(pBuf);delete[]pwBuf;delete[]pBuf;pwBuf NULL;pBuf NULL;return retStr;
}string CPythonHelper::CStringToPyString(CString text)
{string tt CT2A(text);string strUTF8 string_To_UTF8(tt);return strUTF8;
}CString CPythonHelper::PyObjectToCString(PyObject *pPyObj)
{PyObject* str PyUnicode_AsEncodedString(pPyObj, utf-8, Error);char *result (PyBytes_AsString(str));string temp UTF8_To_string(result);CString strResult CString(temp.c_str());return strResult;
}
int CPythonHelper::PyObjectToInt(PyObject *pPyObj)
{int data 0;PyArg_Parse(pPyObj, i, data);return data;
}
double CPythonHelper::PyObjectToFloat(PyObject *pPyObj)
{double data 0;PyArg_Parse(pPyObj, d, data);return data;
}int CPythonHelper::PyObjectToFloatArray(PyObject *pPyObj, CArraydouble, double szData)
{szData.RemoveAll();int SizeOfList PyList_Size(pPyObj);for (int i 0; i SizeOfList; i){PyObject *Item PyList_GetItem(pPyObj, i);double result0;PyArg_Parse(Item, d, result);szData.Add(result);}return SizeOfList;}void CPythonHelper::Initialize()
{if (!Py_IsInitialized()){Py_Initialize();}}void CPythonHelper::Finalize()
{if (Py_IsInitialized()){Py_Finalize();}}
PyObject* CPythonHelper::GetPyFunc(CString strModuleName, CString strFuncName)
{string pModuleName CStringToPyString(strModuleName);string pFuncName CStringToPyString(strFuncName);return GetPyFunc((char*)pModuleName.c_str(), (char*)pFuncName.c_str());}PyObject* CPythonHelper::GetPyFunc(char* pModuleName, char* pFuncName)
{PyObject *pModule PyImport_ImportModule(pModuleName);PyObject *pFunc PyObject_GetAttrString(pModule, pFuncName);//Py_CLEAR(pModule);return pFunc;
}PyObject * CPythonHelper::RunPyFunc(char* pModuleName, char* pFuncName, PyObject *pArgs)
{PyObject *pFunc GetPyFunc(pModuleName, pFuncName);PyObject *pRetrun PyObject_CallObject(pFunc, pArgs); //Py_CLEAR(pFunc);return pRetrun;
}
PyObject * CPythonHelper::RunPyFunc(CString strModuleName, CString strFuncName, PyObject *pArgs)
{string pModuleName CStringToPyString(strModuleName);string pFuncName CStringToPyString(strFuncName);PyObject *pRetrun RunPyFunc((char*)pModuleName.c_str(), (char*)pFuncName.c_str(), pArgs); return pRetrun;
}
int CPythonHelper::PyTupleSetItem(PyObject * pObject, Py_ssize_t index, PyObject * pData)
{return PyTuple_SetItem(pObject, index, pData);
}PyObject* CPythonHelper::IntToPyObject(int data)
{return Py_BuildValue(i, data);
}
PyObject* CPythonHelper::FloatToPyObject(double data)
{return Py_BuildValue(d, data);
}PyObject* CPythonHelper::FloatArrayToPyObject(CArraydouble, double szData)
{int nSize szData.GetSize();PyObject *PyList PyList_New(nSize);for (int i 0; i PyList_Size(PyList); i){PyList_SetItem(PyList, i, PyFloat_FromDouble(szData[i]));}return PyList;
}
PyObject* CPythonHelper::CStringToPyObject(CString data)
{return Py_BuildValue(s, (CStringToPyString(data).c_str())); }PyObject* CPythonHelper::CreateArgs(int size)
{return PyTuple_New(size);
}
C_Test.py
def Hello():print(hello Python)def Add(a,b):import numpy as npprint(np.pi)return abdef GetText(msg):print(msg)return msg;
程序调用示例-整数一
CPythonHelper PY;PY.Initialize();int a 10;int b 20;int sum 0; //参数设置PyObject *pArgs PyTuple_New(2);PY.PyTupleSetItem(pArgs, 0,Py_BuildValue(i, a));PY.PyTupleSetItem(pArgs, 1, Py_BuildValue(i, b));//调用函数PyObject *pRetrun PY.RunPyFunc(PYTHON_FILE_NAME, _T(Add), pArgs);//返回值转换PyArg_Parse(pRetrun, i, sum);//输出CString strResult _T();strResult.Format(_T(%d%d%d), a, b, sum);AfxMessageBox(strResult);PY.Finalize();程序调用示例-字符串二 CPythonHelper PY;PY.Initialize();CString strText _T(ABC中国人123);//参数设置PyObject *pArgs PyTuple_New(1);PY.PyTupleSetItem(pArgs, 0, Py_BuildValue(s, PY.CStringToPyString(strText).c_str()));//调用函数PyObject *pRetrun PY.RunPyFunc(PYTHON_FILE_NAME, _T(GetText), pArgs);//返回值转换CString strResult PY.PyObjectToCString(pRetrun);//输出AfxMessageBox(strResult);PY.Finalize();
程序调用示例-数组三 CPythonHelper PY;PY.Initialize();CString strText _T(ABC中国人123);//参数设置PyObject *pArgs PY.CreateArgs(1);PyObject* pObject PY.CStringToPyObject(strText);CArraydouble, double szData;szData.Add(1.0);szData.Add(1.1);szData.Add(2);PyObject *PyList PY.FloatArrayToPyObject(szData);PY.PyTupleSetItem(pArgs, 0, PyList);//调用函数PyObject *pReturn PY.RunPyFunc(PYTHON_FILE_NAME, _T(SetVaule), pArgs);//返回值转换PY.PyObjectToFloatArray(pReturn, szData);PY.Finalize();