int load_tkinter_funcs(void) { // Load tkinter global funcs from tkinter compiled module. // Return 0 for success, non-zero for failure. int ret = -1; void *main_program, *tkinter_lib; char *tkinter_libname; PyObject *pModule = NULL, *pSubmodule = NULL, *pString = NULL; // Try loading from the main program namespace first main_program = dlopen(NULL, RTLD_LAZY); if (_func_loader(main_program) == 0) { return 0; } // Clear exception triggered when we didn't find symbols above. PyErr_Clear(); // Now try finding the tkinter compiled module pModule = PyImport_ImportModule(TKINTER_PKG); if (pModule == NULL) { goto exit; } pSubmodule = PyObject_GetAttrString(pModule, TKINTER_MOD); if (pSubmodule == NULL) { goto exit; } pString = PyObject_GetAttrString(pSubmodule, "__file__"); if (pString == NULL) { goto exit; } tkinter_libname = fname2char(pString); if (tkinter_libname == NULL) { goto exit; } tkinter_lib = dlopen(tkinter_libname, RTLD_LAZY); if (tkinter_lib == NULL) { PyErr_SetString(PyExc_RuntimeError, "Cannot dlopen tkinter module file"); goto exit; } ret = _func_loader(tkinter_lib); // dlclose probably safe because tkinter has been imported. dlclose(tkinter_lib); exit: Py_XDECREF(pModule); Py_XDECREF(pSubmodule); Py_XDECREF(pString); return ret; }
void load_tkinter_funcs(void) { // Load tkinter global funcs from tkinter compiled module. // Sets an error on failure. void *main_program, *tkinter_lib; PyObject *module = NULL, *py_path = NULL, *py_path_b = NULL; char *path; // Try loading from the main program namespace first. main_program = dlopen(NULL, RTLD_LAZY); if (_func_loader(main_program) == 0) { goto exit; } // Clear exception triggered when we didn't find symbols above. PyErr_Clear(); // Handle PyPy first, as that import will correctly fail on CPython. module = PyImport_ImportModule("_tkinter.tklib_cffi"); // PyPy if (!module) { PyErr_Clear(); module = PyImport_ImportModule("_tkinter"); // CPython } if (!(module && (py_path = PyObject_GetAttrString(module, "__file__")) && (py_path_b = PyUnicode_EncodeFSDefault(py_path)) && (path = PyBytes_AsString(py_path_b)))) { goto exit; } tkinter_lib = dlopen(path, RTLD_LAZY); if (!tkinter_lib) { PyErr_SetString(PyExc_RuntimeError, dlerror()); goto exit; } _func_loader(tkinter_lib); // dlclose is safe because tkinter has been imported. dlclose(tkinter_lib); goto exit; exit: Py_XDECREF(module); Py_XDECREF(py_path); Py_XDECREF(py_path_b); }
int load_tkinter_funcs(void) { /* * Load tkinter global funcs from tkinter compiled module. * Return 0 for success, non-zero for failure. */ int ret = -1; void *tkinter_lib; char *tkinter_libname; PyObject *pModule = NULL, *pString = NULL; pModule = PyImport_ImportModule(TKINTER_FINDER); if (pModule == NULL) { goto exit; } pString = PyObject_GetAttrString(pModule, "TKINTER_LIB"); if (pString == NULL) { goto exit; } tkinter_libname = fname2char(pString); if (tkinter_libname == NULL) { goto exit; } tkinter_lib = dlopen(tkinter_libname, RTLD_LAZY); if (tkinter_lib == NULL) { PyErr_SetString(PyExc_RuntimeError, "Cannot dlopen tkinter module file"); goto exit; } ret = _func_loader(tkinter_lib); /* dlclose probably safe because tkinter has been imported. */ dlclose(tkinter_lib); exit: Py_XDECREF(pModule); Py_XDECREF(pString); return ret; }