From 0814cdf54ec9a0440c82d0d7ec81b8dc9ecc93ea Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 18 Apr 2011 08:27:50 +0000 Subject: [PATCH] fix [#26951] blenderplayer and runtimes will not load blenderplayer wasn't finding bundled python, eg: ./2.57/python/lib --- source/blender/python/generic/py_capi_utils.c | 44 +++++++++++++++++ source/blender/python/generic/py_capi_utils.h | 2 + source/blender/python/intern/bpy_interface.c | 49 +------------------ source/gameengine/Ketsji/KX_PythonInit.cpp | 4 ++ 4 files changed, 52 insertions(+), 47 deletions(-) diff --git a/source/blender/python/generic/py_capi_utils.c b/source/blender/python/generic/py_capi_utils.c index 7182d5f75d0..de9bfb4013b 100644 --- a/source/blender/python/generic/py_capi_utils.c +++ b/source/blender/python/generic/py_capi_utils.c @@ -30,6 +30,8 @@ #include "py_capi_utils.h" +#include "BKE_font.h" /* only for utf8towchar, should replace with py funcs but too late in release now */ + #define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL) /* for debugging */ @@ -284,6 +286,48 @@ void PyC_MainModule_Restore(PyObject *main_mod) Py_XDECREF(main_mod); } +/* must be called before Py_Initialize, expects output of BLI_get_folder(BLENDER_PYTHON, NULL) */ +void PyC_SetHomePath(const char *py_path_bundle) +{ + if(py_path_bundle==NULL) { + /* Common enough to have bundled *nix python but complain on OSX/Win */ +#if defined(__APPLE__) || defined(_WIN32) + fprintf(stderr, "Warning! bundled python not found and is expected on this platform. (if you built with CMake: 'install' target may have not been built)\n"); +#endif + return; + } + /* set the environment path */ + printf("found bundled python: %s\n", py_path_bundle); + +#ifdef __APPLE__ + /* OSX allow file/directory names to contain : character (represented as / in the Finder) + but current Python lib (release 3.1.1) doesn't handle these correctly */ + if(strchr(py_path_bundle, ':')) + printf("Warning : Blender application is located in a path containing : or / chars\ + \nThis may make python import function fail\n"); +#endif + +#ifdef _WIN32 + /* cmake/MSVC debug build crashes without this, why only + in this case is unknown.. */ + { + BLI_setenv("PYTHONPATH", py_path_bundle); + } +#endif + + { + static wchar_t py_path_bundle_wchar[1024]; + + /* cant use this, on linux gives bug: #23018, TODO: try LANG="en_US.UTF-8" /usr/bin/blender, suggested 22008 */ + /* mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR); */ + + utf8towchar(py_path_bundle_wchar, py_path_bundle); + + Py_SetPythonHome(py_path_bundle_wchar); + // printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar); + } +} + /* Would be nice if python had this built in */ void PyC_RunQuicky(const char *filepath, int n, ...) { diff --git a/source/blender/python/generic/py_capi_utils.h b/source/blender/python/generic/py_capi_utils.h index 0b821759bec..1730ad71721 100644 --- a/source/blender/python/generic/py_capi_utils.h +++ b/source/blender/python/generic/py_capi_utils.h @@ -48,4 +48,6 @@ void PyC_RunQuicky(const char *filepath, int n, ...); void PyC_MainModule_Backup(PyObject **main_mod); void PyC_MainModule_Restore(PyObject *main_mod); +void PyC_SetHomePath(const char *py_path_bundle); + #endif // PY_CAPI_UTILS_H diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index 555b42eb6fb..0afbe9a7003 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -164,52 +164,6 @@ void BPY_modules_update(bContext *C) bpy_context_module->ptr.data= (void *)C; } -/* must be called before Py_Initialize */ -#ifndef WITH_PYTHON_MODULE -static void bpy_python_start_path(void) -{ - char *py_path_bundle= BLI_get_folder(BLENDER_PYTHON, NULL); - - if(py_path_bundle==NULL) { - /* Common enough to have bundled *nix python but complain on OSX/Win */ -#if defined(__APPLE__) || defined(_WIN32) - fprintf(stderr, "Warning! bundled python not found and is expected on this platform. (if you built with CMake: 'install' target may have not been built)\n"); -#endif - return; - } - /* set the environment path */ - printf("found bundled python: %s\n", py_path_bundle); - -#ifdef __APPLE__ - /* OSX allow file/directory names to contain : character (represented as / in the Finder) - but current Python lib (release 3.1.1) doesn't handle these correctly */ - if(strchr(py_path_bundle, ':')) - printf("Warning : Blender application is located in a path containing : or / chars\ - \nThis may make python import function fail\n"); -#endif - -#ifdef _WIN32 - /* cmake/MSVC debug build crashes without this, why only - in this case is unknown.. */ - { - BLI_setenv("PYTHONPATH", py_path_bundle); - } -#endif - - { - static wchar_t py_path_bundle_wchar[FILE_MAX]; - - /* cant use this, on linux gives bug: #23018, TODO: try LANG="en_US.UTF-8" /usr/bin/blender, suggested 22008 */ - /* mbstowcs(py_path_bundle_wchar, py_path_bundle, FILE_MAXDIR); */ - - utf8towchar(py_path_bundle_wchar, py_path_bundle); - - Py_SetPythonHome(py_path_bundle_wchar); - // printf("found python (wchar_t) '%ls'\n", py_path_bundle_wchar); - } -} -#endif - void BPY_context_set(bContext *C) { BPy_SetContext(C); @@ -242,7 +196,8 @@ void BPY_python_start(int argc, const char **argv) /* must run before python initializes */ PyImport_ExtendInittab(bpy_internal_modules); - bpy_python_start_path(); /* allow to use our own included python */ + /* allow to use our own included python */ + PyC_SetHomePath(BLI_get_folder(BLENDER_PYTHON, NULL)); /* Python 3.2 now looks for '2.57/python/include/python3.2d/pyconfig.h' to parse * from the 'sysconfig' module which is used by 'site', so for now disable site. diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index ba698d79fdd..a3738995db3 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -1758,6 +1758,7 @@ static struct _inittab bge_internal_modules[]= { /** * Python is not initialised. + * see bpy_interface.c's BPY_python_start() which shares the same functionality in blender. */ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecurityLevel level, Main *maggie, int argc, char** argv) { @@ -1779,6 +1780,9 @@ PyObject* initGamePlayerPythonScripting(const STR_String& progname, TPythonSecur /* must run before python initializes */ PyImport_ExtendInittab(bge_internal_modules); + /* find local python installation */ + PyC_SetHomePath(BLI_get_folder(BLENDER_PYTHON, NULL)); + Py_Initialize(); if(argv && first_time) { /* browser plugins dont currently set this */