//--------------------------------------------------------------------------------- // Initializes python. //--------------------------------------------------------------------------------- bool CPythonManager::Initialize( void ) { // Construct a path to the python engine directory. char szPythonHome[MAX_GAME_PATH]; V_snprintf(szPythonHome, MAX_GAME_PATH, "%s/Python3", g_GamePaths.GetSPDir()); V_FixSlashes(szPythonHome); DevMsg(1, "[SP] Python home path set to %s\n", szPythonHome); // Convert to wide char for python. wchar_t wszPythonHome[1024]; V_strtowcs(szPythonHome, -1, wszPythonHome, 1024); // Set that as the python home directory. Py_SetPythonHome(wszPythonHome); Py_SetProgramName(wszPythonHome); Py_SetPath(wszPythonHome); // Initialize python and its namespaces. Py_Initialize(); // Print some information DevMsg(1, "Python version %s initialized!\n", Py_GetVersion()); // Make sure sys is imported. PyRun_SimpleString("import sys"); // Add the Python API path. AddToSysPath("/packages/source-python"); // Add operating system specific paths. #if defined(WIN32) AddToSysPath("/Python3/plat-win"); #else AddToSysPath("/Python3/plat-linux"); // We've got a bunch of linux shared objects here we need to load. AddToSysPath("/Python3/lib-dynload"); #endif // Site packages for any extra packages... AddToSysPath("/packages/site-packages"); // Add the custom packages path. AddToSysPath("/packages/custom"); // And of course, the plugins directory for script imports. AddToSysPath("/plugins"); // Initialize all converters InitConverters(); // Initialize all submodules modulsp_init(); // Import the main module file. DevMsg(1, "[SP] Importing main module..\n"); BEGIN_BOOST_PY() python::import("__init__"); END_BOOST_PY_NORET(); // Noret because we have more stuff to do after this import. DevMsg(0, "[Source.Python] Loaded successfully.\n"); return true; }
//--------------------------------------------------------------------------------- // Initializes python. //--------------------------------------------------------------------------------- bool CPythonManager::Initialize( void ) { // Construct a path to the python engine directory. char szPythonHome[MAX_PATH_LENGTH]; V_snprintf(szPythonHome, MAX_PATH_LENGTH, "%s/Python3", GetSourcePythonDir()); V_FixSlashes(szPythonHome); DevMsg(1, MSG_PREFIX "Python home path set to %s\n", szPythonHome); // Convert to wide char for python. wchar_t wszPythonHome[MAX_PATH_LENGTH]; V_strtowcs(szPythonHome, -1, wszPythonHome, MAX_PATH_LENGTH); // Set that as the python home directory. Py_SetPythonHome(wszPythonHome); Py_SetProgramName(wszPythonHome); Py_SetPath(wszPythonHome); // Initialize python and its namespaces. Py_Initialize(); // Print some information DevMsg(1, MSG_PREFIX "Python version %s initialized!\n", Py_GetVersion()); // Set sys.argv and update sys.path DevMsg(1, MSG_PREFIX "Setting sys.argv...\n"); ICommandLine* pCommandLine = CommandLine(); int iParamCount = pCommandLine->ParmCount(); wchar_t** argv = new wchar_t*[iParamCount]; for (int i=0; i < iParamCount; i++) { const char* szParam = pCommandLine->GetParm(i); int iParamLength = strlen(szParam); wchar_t* wszParam = new wchar_t[iParamLength+1]; // Not sure what's wrong with V_strtowcs, but it seems like it // doesn't convert the string correctly on Linux mbstowcs(wszParam, szParam, iParamLength+1); argv[i] = wszParam; } PySys_SetArgv(iParamCount, argv); // Make sure sys is imported. PyRun_SimpleString("import sys"); // Add the Python API path. AddToSysPath("/packages/source-python"); // Add operating system specific paths. #if defined(WIN32) AddToSysPath("/Python3/plat-win"); #else AddToSysPath("/Python3/plat-linux"); // We've got a bunch of linux shared objects here we need to load. AddToSysPath("/Python3/lib-dynload"); #endif // Site packages for any extra packages... AddToSysPath("/packages/site-packages"); // Add the custom packages path. AddToSysPath("/packages/custom"); // And of course, the plugins directory for script imports. AddToSysPath("/plugins"); // Initialize all converters InitConverters(); // Initialize all submodules if (!modulsp_init()) { Msg(MSG_PREFIX "Failed to initialize internal modules.\n"); return false; } // Import the main module file. DevMsg(1, MSG_PREFIX "Loading main module...\n"); try { python::import("__init__").attr("load")(); } catch( ... ) { PyErr_Print(); PyErr_Clear(); Msg(MSG_PREFIX "Failed to load the main module.\n"); return false; } return true; }