#include #include #include #include class pythonCpp { public: //二选一 //使用程序自带的虚拟环境 void activateVirtualEnv(const std::string& pyPath, const std::string& venvName); //使用安装好的python解释器 void activatePythonEnv(wchar_t* envPath) { Py_SetPythonHome(envPath); } //END pythonCpp() { //activatePythonEnv(L"./Python312"); activateVirtualEnv("./Python312","env"); Py_Initialize(); //PyRun_SimpleString("import os; print('PYTHONHOME:', os.getenv('PYTHONHOME'))"); //PyRun_SimpleString("import sys; print('sys.path:', sys.path)"); } ~pythonCpp() { Py_Finalize(); } //ONLY RELEASE bool runPythonScript_R(const std::string& scriptPath); //RECOMMAND bool runPythonScript(const std::string& scriptPath); bool runPythonScript(const std::string& scriptPath, const std::vector& args) { PyObject* pArgs = PyList_New(args.size() + 1); // 加1是因为第一个参数是脚本路径 PyList_SetItem(pArgs, 0, Py_BuildValue("s", scriptPath.c_str())); // 设置脚本路径 for (size_t i = 0; i < args.size(); ++i) { PyList_SetItem(pArgs, i + 1, Py_BuildValue("s", args[i].c_str())); } PyObject* sys = PyImport_ImportModule("sys"); PyObject* sys_argv = PyObject_GetAttrString(sys, "argv"); Py_DECREF(sys_argv); PyObject_SetAttrString(sys, "argv", pArgs); Py_DECREF(pArgs); Py_DECREF(sys); PyObject* obj = Py_BuildValue("s", scriptPath.c_str()); FILE* file = _Py_fopen_obj(obj, "r+"); if (file == NULL) { Py_DECREF(obj); return false; } PyRun_SimpleFile(file, scriptPath.c_str()); Py_DECREF(obj); } }; #pragma once