[Bf-blender-cvs] [bc2f77e] master: Add bpy.app.binary_path_python

Campbell Barton noreply at git.blender.org
Wed May 6 03:26:30 CEST 2015


Commit: bc2f77e1da8f4a4e9074223824c9d3d29fc87a7b
Author: Campbell Barton
Date:   Wed May 6 11:07:15 2015 +1000
Branches: master
https://developer.blender.org/rBbc2f77e1da8f4a4e9074223824c9d3d29fc87a7b

Add bpy.app.binary_path_python

Access to the python binary distributed with Blender,
fallback to system python executable (matching Blender's version).

===================================================================

M	source/blender/blenkernel/BKE_appdir.h
M	source/blender/blenkernel/intern/appdir.c
M	source/blender/python/intern/bpy_app.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_appdir.h b/source/blender/blenkernel/BKE_appdir.h
index 5e42f17..077fe2a 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 61aa0eb..4c7cda9 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 04ab34e..1cf0c44 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},




More information about the Bf-blender-cvs mailing list