14#include <frameobject.h>
16#ifdef WITH_PYTHON_MODULE
17# include "pylifecycle.h"
88static int bpy_timer_count = 0;
90static double bpy_timer;
92static double bpy_timer_run;
94static double bpy_timer_run_tot;
117 *gilstate = PyGILState_Ensure();
124 if (bpy_timer_count == 0) {
127 bpy_timer_run = bpy_timer_run_tot = 0.0;
141 PyGILState_Release(*gilstate);
145 fprintf(stderr,
"ERROR: Python context internal state bug. this should not happen!\n");
171 const char *context_members[],
172 uint context_members_len)
174 PyGILState_STATE gilstate;
177 gilstate = PyGILState_Ensure();
181 if (*dict_p == dict_orig) {
182 *dict_p = PyDict_Copy(
static_cast<PyObject *
>(dict_orig));
185 PyObject *dict =
static_cast<PyObject *
>(*dict_p);
190 for (
uint i = 0;
i < context_members_len;
i++) {
191 PyObject *key = PyUnicode_FromString(context_members[
i]);
192 PyObject *item = _PyDict_Pop(dict, key, Py_None);
198 PyGILState_Release(gilstate);
205 PyGILState_STATE gilstate;
209 gilstate = PyGILState_Ensure();
212 Py_DECREF((PyObject *)text->
compiled);
216 PyGILState_Release(gilstate);
226 PyObject *
mod = PyImport_ImportModuleLevel(
"bpy",
nullptr,
nullptr,
nullptr, 0);
250#ifdef WITH_AUDASPACE_PY
257static PyObject *CCL_initPython()
289#ifdef WITH_AUDASPACE_PY
293 {
"_cycles", CCL_initPython},
303#ifndef WITH_PYTHON_MODULE
315 if (
UNLIKELY(PyStatus_Exception(status))) {
316 fputs(
"Internal error initializing Python!\n", stderr);
318 Py_ExitStatusException(status);
325#ifndef WITH_PYTHON_MODULE
326 BLI_assert_msg(Py_IsInitialized() == 0,
"Python has already been initialized");
330 PyPreConfig preconfig;
337 "Initializing %s support for the systems Python environment such as 'PYTHONPATH' and "
338 "the user-site directory.",
342 PyPreConfig_InitPythonConfig(&preconfig);
348 PyPreConfig_InitIsolatedConfig(&preconfig);
364 preconfig.utf8_mode =
true;
369 status = Py_PreInitialize(&preconfig);
380 bool has_python_executable =
false;
383 PyConfig_InitPythonConfig(&config);
388 PyConfig_InitIsolatedConfig(&config);
393 config.install_signal_handlers = 1;
398 config.pathconfig_warnings = 0;
410 config.parse_argv = 0;
411 status = PyConfig_SetBytesArgv(&config, argc, (
char *
const *)argv);
421 status = PyConfig_SetBytesString(&config, &config.program_name, program_path);
430 program_path,
sizeof(program_path), PY_MAJOR_VERSION, PY_MINOR_VERSION))
432 status = PyConfig_SetBytesString(&config, &config.executable, program_path);
434 has_python_executable =
true;
439 "Unable to find the Python binary, "
440 "the multiprocessing module may not be functional!\n");
448 if (py_path_bundle.has_value()) {
454 if (strchr(py_path_bundle->c_str(),
':')) {
456 "Warning! Blender application is located in a path containing ':' or '/' chars\n"
457 "This may make Python import function fail\n");
461 status = PyConfig_SetBytesString(&config, &config.home, py_path_bundle->c_str());
464# ifdef PYTHON_SSL_CERT_FILE
466 const char *ssl_cert_file_env =
"SSL_CERT_FILE";
467 if (
BLI_getenv(ssl_cert_file_env) ==
nullptr) {
468 const char *ssl_cert_file_suffix = PYTHON_SSL_CERT_FILE;
471 ssl_cert_file,
sizeof(ssl_cert_file), py_path_bundle->c_str(), ssl_cert_file_suffix);
478# if defined(__APPLE__) || defined(_WIN32)
480 "Bundled Python not found and is expected on this platform "
481 "(the 'install' target may have not been built)\n");
487 status = Py_InitializeFromConfig(&config);
488 PyConfig_Clear(&config);
492 if (!has_python_executable) {
493 PySys_SetObject(
"executable", Py_None);
500 Py_DECREF(PyImport_ImportModule(
"threading"));
518#ifdef WITH_PYTHON_MODULE
521 struct _inittab *inittab_item;
522 PyObject *sys_modules = PyImport_GetModuleDict();
525 PyObject *
mod = inittab_item->initfunc();
527 PyDict_SetItemString(sys_modules, inittab_item->name,
mod);
546#ifndef WITH_PYTHON_MODULE
551 PyEval_ReleaseThread(PyGILState_GetThisThreadState());
555#ifdef WITH_PYTHON_MODULE
557 const char *imports[] = {
"atexit",
"addon_utils",
nullptr};
564#ifndef WITH_PYTHON_MODULE
565 BLI_assert_msg(Py_IsInitialized() != 0,
"Python must be initialized");
569 PyGILState_STATE gilstate = PyGILState_Ensure();
592#ifndef WITH_PYTHON_MODULE
596 if (do_python_exit) {
601 PyGILState_Release(gilstate);
602 (void)do_python_exit;
610 printf(
"tot exec: %d, ", bpy_timer_count);
611 printf(
"tot run: %.4fsec, ", bpy_timer_run_tot);
612 if (bpy_timer_count > 0) {
613 printf(
"average run: %.6fsec, ", (bpy_timer_run_tot / bpy_timer_count));
616 if (bpy_timer > 0.0) {
617 printf(
"tot usage %.4f%%", (bpy_timer_run_tot / bpy_timer) * 100.0);
626 BLI_assert_msg(Py_IsInitialized() != 0,
"Python must be initialized");
630 G.autoexec_fail[0] =
'\0';
650 fputs(
"\n# Python backtrace\n", fp);
656 PyFrameObject *frame = PyEval_GetFrame();
657 if (frame ==
nullptr) {
661 PyCodeObject *code = PyFrame_GetCode(frame);
662 const int line = PyFrame_GetLineNumber(frame);
663 const char *filepath = PyUnicode_AsUTF8(code->co_filename);
664 const char *funcname = PyUnicode_AsUTF8(code->co_name);
665 fprintf(fp,
" File \"%s\", line %d in %s\n", filepath, line, funcname);
666 }
while ((frame = PyFrame_GetBack(frame)));
671 const PyGILState_STATE gilstate = PyGILState_Ensure();
672 Py_DECREF((PyObject *)pyob_ptr);
673 PyGILState_Release(gilstate);
678 const PyGILState_STATE gilstate = PyGILState_Ensure();
679 const bool do_invalidate = (Py_REFCNT((PyObject *)pyob_ptr) > 1);
680 Py_DECREF((PyObject *)pyob_ptr);
684 PyGILState_Release(gilstate);
689 PyGILState_STATE gilstate;
694 if (bmain ==
nullptr) {
714 printf(
"scripts disabled for \"%s\", skipping '%s'\n",
734 PyGILState_STATE gilstate;
737 gilstate = PyGILState_Ensure();
746 item = PyDict_GetItemString(pyctx, member);
748 if (item ==
nullptr) {
751 else if (item == Py_None) {
762 else if (PySequence_Check(item)) {
763 PyObject *seq_fast = PySequence_Fast(item,
"bpy_context_get sequence conversion");
764 if (seq_fast ==
nullptr) {
769 const int len = PySequence_Fast_GET_SIZE(seq_fast);
770 PyObject **seq_fast_items = PySequence_Fast_ITEMS(seq_fast);
773 for (
i = 0;
i <
len;
i++) {
774 PyObject *list_item = seq_fast_items[
i];
783 "'%s' list item not a valid type in sequence type '%s'",
785 Py_TYPE(item)->tp_name);
807 PyGILState_Release(gilstate);
813#ifdef WITH_PYTHON_MODULE
816static void bpy_module_free(
void *
mod);
819extern int main_python_enter(
int argc,
const char **argv);
820extern void main_python_exit();
822static struct PyModuleDef bpy_proxy_def = {
841static void bpy_module_delay_init(PyObject *bpy_proxy)
847 PyObject *filepath_obj = PyModule_GetFilenameObject(bpy_proxy);
850 const char *filepath_rel = PyUnicode_AsUTF8(filepath_obj);
851 char filepath_abs[1024];
853 STRNCPY(filepath_abs, filepath_rel);
855 Py_DECREF(filepath_obj);
857 argv[0] = filepath_abs;
860 main_python_enter(argc, argv);
863 PyDict_Update(PyModule_GetDict(bpy_proxy), PyModule_GetDict(
bpy_package_py));
870static bool bpy_module_ensure_compatible_version()
876 const uint version_runtime = Py_Version;
878 uint version_compile_major = PY_VERSION_HEX >> 24;
879 uint version_compile_minor = ((PY_VERSION_HEX & 0x00ff0000) >> 16);
880 uint version_runtime_major = version_runtime >> 24;
881 uint version_runtime_minor = ((version_runtime & 0x00ff0000) >> 16);
882 if ((version_compile_major != version_runtime_major) ||
883 (version_compile_minor != version_runtime_minor))
885 PyErr_Format(PyExc_ImportError,
886 "The version of \"bpy\" was compiled with: "
887 "(%u.%u) is incompatible with: (%u.%u) used by the interpreter!",
888 version_compile_major,
889 version_compile_minor,
890 version_runtime_major,
891 version_runtime_minor);
897static void dealloc_obj_dealloc(PyObject *
self);
899static PyTypeObject dealloc_obj_Type;
902static void dealloc_obj_dealloc(PyObject *
self)
904 bpy_module_delay_init(((dealloc_obj *)
self)->
mod);
908 dealloc_obj_Type.tp_free(
self);
911PyMODINIT_FUNC PyInit_bpy();
913PyMODINIT_FUNC PyInit_bpy()
915 if (!bpy_module_ensure_compatible_version()) {
919 PyObject *bpy_proxy = PyModule_Create(&bpy_proxy_def);
939 dealloc_obj_Type.tp_name =
"dealloc_obj";
940 dealloc_obj_Type.tp_basicsize =
sizeof(dealloc_obj);
941 dealloc_obj_Type.tp_dealloc = dealloc_obj_dealloc;
942 dealloc_obj_Type.tp_flags = Py_TPFLAGS_DEFAULT;
944 if (PyType_Ready(&dealloc_obj_Type) < 0) {
948 dob = (dealloc_obj *)dealloc_obj_Type.tp_alloc(&dealloc_obj_Type, 0);
949 dob->mod = bpy_proxy;
950 PyModule_AddObject(bpy_proxy,
"__file__", (PyObject *)dob);
955static void bpy_module_free(
void * )
965 const char *kwlist[] = {
966 "False",
"None",
"True",
"and",
"as",
"assert",
"async",
"await",
"break",
967 "class",
"continue",
"def",
"del",
"elif",
"else",
"except",
"finally",
"for",
968 "from",
"global",
"if",
"import",
"in",
"is",
"lambda",
"nonlocal",
"not",
969 "or",
"pass",
"raise",
"return",
"try",
"while",
"with",
"yield",
nullptr,
972 for (
int i = 0; kwlist[
i];
i++) {
PyObject * AUD_initPython(void)
const char * BKE_appdir_program_path() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
bool BKE_appdir_program_python_search(char *program_filepath, size_t program_filepath_maxncpy, int version_major, int version_minor) ATTR_NONNULL(1)
std::optional< std::string > BKE_appdir_folder_id(int folder_id, const char *subfolder) ATTR_WARN_UNUSED_RESULT
void CTX_wm_operator_poll_msg_clear(bContext *C)
Main * CTX_data_main(const bContext *C)
void CTX_data_list_add_ptr(bContextDataResult *result, const PointerRNA *ptr)
@ CTX_DATA_TYPE_COLLECTION
void CTX_data_pointer_set_ptr(bContextDataResult *result, const PointerRNA *ptr)
void * CTX_py_dict_get(const bContext *C)
void CTX_data_type_set(bContextDataResult *result, short type)
@ G_FLAG_SCRIPT_AUTOEXEC_FAIL_QUIET
@ G_FLAG_SCRIPT_AUTOEXEC_FAIL
const char * BKE_main_blendfile_path(const Main *bmain) ATTR_NONNULL()
bool text_check_identifier_nodigit(char ch)
bool text_check_identifier(char ch)
#define BLI_assert_msg(a, msg)
void BLI_setenv(const char *env, const char *val) ATTR_NONNULL(1)
#define BLI_path_join(...)
const char * BLI_getenv(const char *env) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
bool BLI_path_abs_from_cwd(char *path, size_t path_maxncpy) ATTR_NONNULL(1)
#define SNPRINTF(dst, format,...)
char * STRNCPY(char(&dst)[N], const char *src)
int BLI_thread_is_main(void)
Platform independent time functions.
double BLI_time_now_seconds(void)
void BPY_app_handlers_reset(bool do_all)
struct CLG_LogRef * BPY_LOG_RNA
struct CLG_LogRef * BPY_LOG_CONTEXT
bool bool BPY_run_text(bContext *C, Text *text, ReportList *reports, bool do_jump) ATTR_NONNULL(1
bool BPY_run_string_eval(bContext *C, const char *imports[], const char *expr)
void * CCL_python_module_init(void)
#define CLG_LOGREF_DECLARE_GLOBAL(var, id)
#define CLOG_INFO(clg_ref, level,...)
PyMODINIT_FUNC BPyInit_bl_math()
PyObject * BPyInit_bmesh()
PyObject * BPyInit_bmesh_geometry()
PyObject * BPyInit_bmesh_types()
PyObject * BPyInit_bmesh_utils()
PyObject * bpy_package_py
void BPy_init_modules(bContext *C)
void BPY_atexit_unregister()
void BPY_atexit_register()
struct CLG_LogRef * BPY_LOG_INTERFACE
void BPY_app_translations_end()
int text_check_identifier_nodigit_unicode(const uint ch)
bool BPY_string_is_keyword(const char *str)
void BPY_python_use_system_env()
void BPY_context_dict_clear_members_array(void **dict_p, void *dict_orig, const char *context_members[], uint context_members_len)
int text_check_identifier_unicode(const uint ch)
int BPY_context_member_get(bContext *C, const char *member, bContextDataResult *result)
void BPY_modules_update()
bContext * BPY_context_get()
void bpy_context_set(bContext *C, PyGILState_STATE *gilstate)
void BPY_context_set(bContext *C)
static void pystatus_exit_on_error(const PyStatus &status)
void BPY_DECREF_RNA_INVALIDATE(void *pyob_ptr)
void BPY_python_backtrace(FILE *fp)
static void bpy_context_end(bContext *C)
void BPY_python_reset(bContext *C)
static bool py_use_system_env
void BPY_context_update(bContext *C)
void BPY_python_end(const bool do_python_exit)
static _inittab bpy_internal_modules[]
bool BPY_python_use_system_env_get()
void BPY_text_free_code(Text *text)
void bpy_context_clear(bContext *, const PyGILState_STATE *gilstate)
void BPY_modules_load_user(bContext *C)
void BPY_python_start(bContext *C, int argc, const char **argv)
void BPY_DECREF(void *pyob_ptr)
void bpy_intern_string_exit()
void bpy_intern_string_init()
PyObject * BPyInit__bpy_path()
void BPY_rna_props_clear_all()
void pyrna_invalidate(BPy_DummyPointerRNA *self)
PyObject * BPY_rna_module()
PyObject * BPY_rna_types()
void BPY_update_rna_module()
BPy_StructRNA * bpy_context_module
#define BPy_StructRNA_Check(v)
VecBase< float, D > constexpr mod(VecOp< float, D >, VecOp< float, D >) RET
PyObject * BPyInit_idprop()
PyObject * BPyInit_imbuf()
PyObject * Manta_initPython(void)
PyMODINIT_FUNC PyInit_mathutils()
PyMODINIT_FUNC PyInit_mathutils_geometry()
PyMODINIT_FUNC PyInit_mathutils_kdtree()
PyMODINIT_FUNC PyInit_mathutils_noise()
bool PyC_IsInterpreterActive()
PyObject * BPyInit_hydra()
header-only compatibility defines.
#define PyThreadState_GetUnchecked