/** * Should be called before executing a script */ void XBPython::Initialize() { CLog::Log(LOGINFO, "initializing python engine. "); CSingleLock lock(m_critSection); m_iDllScriptCounter++; if (!m_bInitialized) { // first we check if all necessary files are installed #ifndef _LINUX if(!FileExist("special://xbmc/system/python/DLLs/_socket.pyd") || !FileExist("special://xbmc/system/python/DLLs/_ssl.pyd") || !FileExist("special://xbmc/system/python/DLLs/bz2.pyd") || !FileExist("special://xbmc/system/python/DLLs/pyexpat.pyd") || !FileExist("special://xbmc/system/python/DLLs/select.pyd") || !FileExist("special://xbmc/system/python/DLLs/unicodedata.pyd")) { CLog::Log(LOGERROR, "Python: Missing files, unable to execute script"); Finalize(); return; } #endif // Info about interesting python envvars available // at http://docs.python.org/using/cmdline.html#environment-variables #if !defined(_WIN32) /* PYTHONOPTIMIZE is set off intentionally when using external Python. Reason for this is because we cannot be sure what version of Python was used to compile the various Python object files (i.e. .pyo, .pyc, etc.). */ // check if we are running as real xbmc.app or just binary if (!CUtil::GetFrameworksPath(true).IsEmpty()) { // using external python, it's build looking for xxx/lib/python2.6 // so point it to frameworks which is where python2.6 is located setenv("PYTHONHOME", _P("special://frameworks").c_str(), 1); setenv("PYTHONPATH", _P("special://frameworks").c_str(), 1); CLog::Log(LOGDEBUG, "PYTHONHOME -> %s", _P("special://frameworks").c_str()); CLog::Log(LOGDEBUG, "PYTHONPATH -> %s", _P("special://frameworks").c_str()); } setenv("PYTHONCASEOK", "1", 1); //This line should really be removed #elif defined(_WIN32) // because the third party build of python is compiled with vs2008 we need // a hack to set the PYTHONPATH // buf is corrupted after putenv and might need a strdup but it seems to // work this way CStdString buf; buf = "PYTHONPATH=" + _P("special://xbmc/system/python/DLLs") + ";" + _P("special://xbmc/system/python/Lib"); pgwin32_putenv(buf.c_str()); buf = "PYTHONOPTIMIZE=1"; pgwin32_putenv(buf.c_str()); buf = "PYTHONHOME=" + _P("special://xbmc/system/python"); pgwin32_putenv(buf.c_str()); buf = "OS=win32"; pgwin32_putenv(buf.c_str()); #endif if (PyEval_ThreadsInitialized()) PyEval_AcquireLock(); else PyEval_InitThreads(); Py_Initialize(); PyEval_ReleaseLock(); // If this is not the first time we initialize Python, the interpreter // lock already exists and we need to lock it as PyEval_InitThreads // would not do that in that case. PyEval_AcquireLock(); char* python_argv[1] = { (char*)"" } ; PySys_SetArgv(1, python_argv); InitXBMCTypes(); InitGUITypes(); InitPluginTypes(); InitAddonTypes(); if (!(m_mainThreadState = PyThreadState_Get())) CLog::Log(LOGERROR, "Python threadstate is NULL."); PyEval_ReleaseLock(); m_bInitialized = true; } }
/** * Should be called before executing a script */ void XBPython::Initialize() { CLog::Log(LOGINFO, "initializing python engine. "); EnterCriticalSection(&m_critSection); m_iDllScriptCounter++; if (!m_bInitialized) { if (dThreadId == GetCurrentThreadId()) { #ifndef _LINUX //DllLoader* pDll = g_sectionLoader.LoadDLL(PYTHON_DLL); m_hModule = dllLoadLibraryA(PYTHON_DLL); m_pDll = DllLoaderContainer::GetModule(m_hModule); #else m_pDll = DllLoaderContainer::LoadModule(PYTHON_DLL, NULL, true); #endif if (!m_pDll || !python_load_dll(*m_pDll)) { CLog::Log(LOGFATAL, "Python: error loading python24.dll"); Finalize(); LeaveCriticalSection(&m_critSection); return; } // first we check if all necessary files are installed #ifndef _LINUX if (!FileExist("Q:\\system\\python\\python24.zlib") || !FileExist("Q:\\system\\python\\DLLs\\_socket.pyd") || !FileExist("Q:\\system\\python\\DLLs\\_ssl.pyd") || !FileExist("Q:\\system\\python\\DLLs\\bz2.pyd") || !FileExist("Q:\\system\\python\\DLLs\\pyexpat.pyd") || !FileExist("Q:\\system\\python\\DLLs\\select.pyd") || !FileExist("Q:\\system\\python\\DLLs\\unicodedata.pyd") || !FileExist("Q:\\system\\python\\DLLs\\zlib.pyd")) { CLog::Log(LOGERROR, "Python: Missing files, unable to execute script"); Finalize(); LeaveCriticalSection(&m_critSection); return; } #endif #ifdef _LINUX // Required for python to find optimized code (pyo) files setenv("PYTHONOPTIMIZE", "1", 1); setenv("PYTHONHOME", _P("Q:/system/python"), 1); setenv("PYTHONPATH", _P("Q:/system/python/python24.zip"), 1); //setenv("PYTHONDEBUG", "1", 1); //setenv("PYTHONINSPECT", "1", 1); //setenv("PYTHONVERBOSE", "1", 1); setenv("PYTHONCASEOK", "1", 1); #endif #ifdef __APPLE__ setenv("PYTHONHOME", _P("Q:\\system\\python"), 1); #endif Py_Initialize(); PyEval_InitThreads(); char* python_argv[1] = { (char*)"" } ; PySys_SetArgv(1, python_argv); InitXBMCTypes(); InitGUITypes(); InitPluginTypes(); mainThreadState = PyThreadState_Get(); // release the lock PyEval_ReleaseLock(); m_bInitialized = true; PulseEvent(m_hEvent); } else { // only the main thread should initialize python. m_iDllScriptCounter--; LeaveCriticalSection(&m_critSection); WaitForSingleObject(m_hEvent, INFINITE); EnterCriticalSection(&m_critSection); } } LeaveCriticalSection(&m_critSection); }