#include "pch.h"#include "ClrCalPython.h"#include <iostream>ClrCalPython::CalPythonFunc::CalPythonFunc(){//_putenv_s("PYTHONHOME", "D:\\Pro\\Anaconda3"); // 设置 Python 安装路径//_putenv_s("PYTHONPATH", "D:\\Pro\\Anaconda3\\Lib"); // 设置 Python 库路径}bool IsPythonHomeSet(){const char* pythonHome = std::getenv("PYTHONHOME");return pythonHome != nullptr;}bool IsPythonPathSet(){const char* pythonPath = std::getenv("PYTHONPATH");return pythonPath != nullptr;}int ClrCalPython::CalPythonFunc::_init(){isInit = false;if (!IsPythonHomeSet()) {std::cout << "PYTHONHOME is not set." << std::endl;lastFlag = 1;lastMsg = "PYTHONHOME is not set.\r\n设置系统变量\r\n PYTHONHOME= D:\\Pro\\Anaconda3";return lastFlag;}// 初始化Python解释器try{Py_Initialize();}catch (...){lastFlag = 3;lastMsg = "Py_Initialize 异常 请检查下面设置是否正确\r\n PYTHONHOME= D:\\Pro\\Anaconda3";return lastFlag;}//1.导入Python模块pModule = PyImport_ImportModule(moduleName);if (pModule == nullptr) {PyErr_Print();std::cerr << "Failed to load Python " << moduleName << std::endl;std::cerr << "请把 " << moduleName << ".py 文件拷贝到运行目录下" << std::endl;lastFlag = 1001;lastMsg = "Failed to load Python mymodule.py 请把 mymodule.py 文件拷贝到运行目录下";return lastFlag;}// 2.获取Python函数pFunc = PyObject_GetAttrString(pModule, functionName);if (pFunc == nullptr || !PyCallable_Check(pFunc)) {if (PyErr_Occurred()) PyErr_Print();std::cerr << "Cannot find function " << functionName << std::endl;Py_XDECREF(pFunc);Py_DECREF(pModule);lastFlag = 1002;lastMsg = "Cannot find function cal_polyfit";return lastFlag;}isInit = true;return 0;}ClrCalPython::CalPythonFunc::~CalPythonFunc(){if (pFunc != nullptr)Py_DECREF(pFunc);if (pModule != nullptr)Py_DECREF(pModule);// 结束Python解释器Py_Finalize();}int ClrCalPython::CalPythonFunc::_cal_polyfit(array<double>^ x, array<double>^ y, int deg,int isShow, array<double>^% abc){if (!isInit)return -3;if (iscalling)return -2;if (pFunc == nullptr)return -1;iscalling = true;// 将 C# 数组转换为 Python 列表PyObject* pyListA = PyList_New(x->Length);PyObject* pyListB = PyList_New(y->Length);for (int i = 0; i < x->Length; ++i) {PyList_SetItem(pyListA, i, PyFloat_FromDouble(x[i]));}for (int i = 0; i < y->Length; ++i) {PyList_SetItem(pyListB, i, PyFloat_FromDouble(y[i]));}// 函数调用PyObject* args = PyTuple_Pack(4, pyListA, pyListB, PyLong_FromLong(deg),PyLong_FromLong(isShow));PyObject* pResult = PyObject_CallObject(pFunc, args);Py_DECREF(pyListA);Py_DECREF(pyListB);Py_DECREF(args);// 检查调用结果if (pResult == nullptr) {PyErr_Print();std::cerr << "Call failed" << std::endl;iscalling = false;return 1;}// 将 Python 返回的列表转换为 C# 的 array<double>^if (PyList_Check(pResult)) {int listSize = PyList_Size(pResult);abc = gcnew array<double>(listSize);for (int i = 0; i < listSize; ++i) {PyObject* item = PyList_GetItem(pResult, i);if (PyFloat_Check(item)) {abc[i] = PyFloat_AsDouble(item);}else {// 非预期的数据类型Py_DECREF(pResult);iscalling = false;return -3;}}}else {// 非预期的返回类型Py_DECREF(pResult);iscalling = false;return -4;}Py_DECREF(pResult);iscalling = false;return 0; // 调用成功}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。