diff options
author | Campbell Barton <ideasman42@gmail.com> | 2015-05-06 04:07:15 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2015-05-06 04:13:42 +0300 |
commit | bc2f77e1da8f4a4e9074223824c9d3d29fc87a7b (patch) | |
tree | 52381accdc30f86e6c4cee51d00995b4da680319 | |
parent | c246e0c3b6bfd4c57d12f8c3b232968b59757e26 (diff) |
Add bpy.app.binary_path_python
Access to the python binary distributed with Blender,
fallback to system python executable (matching Blender's version).
-rw-r--r-- | source/blender/blenkernel/BKE_appdir.h | 5 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/appdir.c | 39 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_app.c | 31 |
3 files changed, 74 insertions, 1 deletions
diff --git a/source/blender/blenkernel/BKE_appdir.h b/source/blender/blenkernel/BKE_appdir.h index 5e42f17be03..077fe2a629c 100644 --- a/source/blender/blenkernel/BKE_appdir.h +++ b/source/blender/blenkernel/BKE_appdir.h @@ -38,6 +38,11 @@ void BKE_appdir_program_path_init(const char *argv0); const char *BKE_appdir_program_path(void); const char *BKE_appdir_program_dir(void); +/* find python executable */ +bool BKE_appdir_program_python_search( + char *fullpath, const size_t fullpath_len, + const int version_major, const int version_minor); + /* Initialize path to temporary directory. */ void BKE_tempdir_init(char *userdir); void BKE_tempdir_system_init(char *dir); diff --git a/source/blender/blenkernel/intern/appdir.c b/source/blender/blenkernel/intern/appdir.c index 61aa0eb617a..4c7cda95ad1 100644 --- a/source/blender/blenkernel/intern/appdir.c +++ b/source/blender/blenkernel/intern/appdir.c @@ -599,6 +599,45 @@ const char *BKE_appdir_program_dir(void) return bprogdir; } +bool BKE_appdir_program_python_search( + char *fullpath, const size_t fullpath_len, + const int version_major, const int version_minor) +{ + const char *basename = "python"; + bool is_found = false; + + { + const char *python_bin_dir = BKE_appdir_folder_id(BLENDER_SYSTEM_PYTHON, "bin"); + if (python_bin_dir) { + BLI_join_dirfile(fullpath, fullpath_len, python_bin_dir, basename); + if ( +#ifdef _WIN32 + BLI_path_program_extensions_add_win32(fullpath, fullpath_len) +#else + BLI_exists(fullpath) +#endif + ) + { + is_found = true; + } + } + } + + if (is_found == false) { + char python_ver[16]; + BLI_snprintf(python_ver, sizeof(python_ver), "%s%d.%d", basename, version_major, version_minor); + if (BLI_path_program_search(fullpath, fullpath_len, python_ver)) { + is_found = true; + } + } + + if (is_found == false) { + *fullpath = '\0'; + } + + return is_found; +} + /** * Gets the temp directory when blender first runs. * If the default path is not found, use try $TEMP diff --git a/source/blender/python/intern/bpy_app.c b/source/blender/python/intern/bpy_app.c index 04ab34efeb4..1cf0c44fd87 100644 --- a/source/blender/python/intern/bpy_app.c +++ b/source/blender/python/intern/bpy_app.c @@ -220,6 +220,33 @@ static int bpy_app_debug_set(PyObject *UNUSED(self), PyObject *value, void *clos return 0; } + + +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 *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); + PyDict_SetItemString(BlenderAppType.tp_dict, "binary_path_python", ret); + } + else { + Py_INCREF(ret); + } + + return ret; + +} + PyDoc_STRVAR(bpy_app_debug_value_doc, "Int, number which can be set to non-zero values for testing purposes" ); @@ -287,7 +314,9 @@ static PyGetSetDef bpy_app_getsets[] = { {(char *)"debug_wm", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_WM}, {(char *)"debug_depsgraph", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_DEPSGRAPH}, {(char *)"debug_simdata", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_SIMDATA}, - {(char *)"debug_gpumem", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_GPU_MEM}, + {(char *)"debug_gpumem", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_GPU_MEM}, + + {(char *)"binary_path_python", bpy_app_binary_path_python_get, NULL, (char *)bpy_app_binary_path_python_doc, NULL}, {(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)bpy_app_debug_value_doc, NULL}, {(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)bpy_app_tempdir_doc, NULL}, |