diff options
-rw-r--r-- | release/scripts/modules/sys_info.py | 4 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_app.c | 33 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_interface.c | 20 |
3 files changed, 22 insertions, 35 deletions
diff --git a/release/scripts/modules/sys_info.py b/release/scripts/modules/sys_info.py index fc3ffe4dd88..cb80529f0f3 100644 --- a/release/scripts/modules/sys_info.py +++ b/release/scripts/modules/sys_info.py @@ -82,10 +82,10 @@ def write_sysinfo(filepath): output.write("\t%r\n" % p) output.write(title("Python (External Binary)")) - output.write("binary path: %s\n" % prepr(bpy.app.binary_path_python)) + output.write("binary path: %s\n" % prepr(sys.executable)) try: py_ver = prepr(subprocess.check_output([ - bpy.app.binary_path_python, + sys.executable, "--version", ]).strip()) except Exception as e: diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c index a580b4f10f0..02ab001dbf6 100644 --- a/source/blender/python/intern/bpy_app.c +++ b/source/blender/python/intern/bpy_app.c @@ -295,36 +295,13 @@ static int bpy_app_global_flag_set__only_disable(PyObject *UNUSED(self), return bpy_app_global_flag_set(NULL, value, closure); } -#define BROKEN_BINARY_PATH_PYTHON_HACK - PyDoc_STRVAR(bpy_app_binary_path_python_doc, - "String, the path to the python executable (read-only)"); -static PyObject *bpy_app_binary_path_python_get(PyObject *self, void *UNUSED(closure)) + "String, the path to the python executable (read-only). " + "Deprecated! Use ``sys.executable`` instead."); +static PyObject *bpy_app_binary_path_python_get(PyObject *UNUSED(self), void *UNUSED(closure)) { - /* refcount is held in BlenderAppType.tp_dict */ - static PyObject *ret = NULL; - - if (ret == NULL) { - /* only run once */ - char fullpath[1024]; - BKE_appdir_program_python_search( - fullpath, sizeof(fullpath), PY_MAJOR_VERSION, PY_MINOR_VERSION); - ret = PyC_UnicodeFromByte(fullpath); -#ifdef BROKEN_BINARY_PATH_PYTHON_HACK - Py_INCREF(ret); - UNUSED_VARS(self); -#else - PyDict_SetItem( - BlenderAppType.tp_dict, - /* XXX BAAAADDDDDD! self is not a PyDescr at all! it's bpy.app!!! */ PyDescr_NAME(self), - ret); -#endif - } - else { - Py_INCREF(ret); - } - - return ret; + PyErr_Warn(PyExc_RuntimeWarning, "Use 'sys.executable' instead of 'binary_path_python'!"); + return Py_INCREF_RET(PySys_GetObject("executable")); } PyDoc_STRVAR(bpy_app_debug_value_doc, diff --git a/source/blender/python/intern/bpy_interface.c b/source/blender/python/intern/bpy_interface.c index c4523363a91..894a9a69198 100644 --- a/source/blender/python/intern/bpy_interface.c +++ b/source/blender/python/intern/bpy_interface.c @@ -306,12 +306,22 @@ void BPY_python_start(bContext *C, int argc, const char **argv) PyThreadState *py_tstate = NULL; const char *py_path_bundle = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, NULL); - /* Not essential but nice to set our name. */ + /* Setting the program name is important so the 'multiprocessing' module + * can launch new Python instances. */ { - const char *program_path = BKE_appdir_program_path(); - wchar_t program_path_wchar[FILE_MAX]; - BLI_strncpy_wchar_from_utf8(program_path_wchar, program_path, ARRAY_SIZE(program_path_wchar)); - Py_SetProgramName(program_path_wchar); + char program_path[FILE_MAX]; + if (BKE_appdir_program_python_search( + program_path, sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION)) { + wchar_t program_path_wchar[FILE_MAX]; + BLI_strncpy_wchar_from_utf8( + program_path_wchar, program_path, ARRAY_SIZE(program_path_wchar)); + Py_SetProgramName(program_path_wchar); + } + else { + fprintf(stderr, + "Unable to find the python binary, " + "the multiprocessing module may not be functional!\n"); + } } /* must run before python initializes */ |