From 9fc466e3cd00bd11c33227e17e6868a9761ad52a Mon Sep 17 00:00:00 2001 From: Tim Rid <6593626+timrid@users.noreply.github.com> Date: Fri, 21 Mar 2025 21:23:31 +0100 Subject: [PATCH 1/3] Add processing of .pth files from "app_packages". --- {{ cookiecutter.format }}/bootstrap/main.c | 61 ++++++++++++++++------ 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/{{ cookiecutter.format }}/bootstrap/main.c b/{{ cookiecutter.format }}/bootstrap/main.c index 4df53da..e019a9b 100644 --- a/{{ cookiecutter.format }}/bootstrap/main.c +++ b/{{ cookiecutter.format }}/bootstrap/main.c @@ -26,6 +26,8 @@ int main(int argc, char *argv[]) { char *bin_path; char *install_path; wchar_t *wtmp_str; + wchar_t *app_packages_path_str; + PyObject *app_packages_path; PyObject *app_module; PyObject *module; PyObject *module_attr; @@ -149,21 +151,6 @@ int main(int argc, char *argv[]) { } PyMem_RawFree(wtmp_str); - // Add the app_packages path - strcpy(path, install_path); - strcat(path, "/{{ cookiecutter.lib_dir }}/{{ cookiecutter.app_name }}/app_packages"); - debug_log("- %s\n", path); - wtmp_str = Py_DecodeLocale(path, NULL); - status = PyWideStringList_Append(&config.module_search_paths, wtmp_str); - if (PyStatus_Exception(status)) { - // crash_dialog("Unable to set app path: %s", status.err_msg); - PyConfig_Clear(&config); - Py_ExitStatusException(status); - } - PyMem_RawFree(wtmp_str); - - free(path); - debug_log("Configure argc/argv...\n"); status = PyConfig_SetBytesArgv(&config, argc, argv); if (PyStatus_Exception(status)) { @@ -180,6 +167,50 @@ int main(int argc, char *argv[]) { Py_ExitStatusException(status); } + + // Adding the app_packages as site directory. + // + // This adds app_packages to sys.path and executes any .pth + // files in that directory. + strcpy(path, install_path); + strcat(path, "/{{ cookiecutter.lib_dir }}/{{ cookiecutter.app_name }}/app_packages"); + app_packages_path_str = Py_DecodeLocale(path, NULL); + free(path); + + debug_log("Adding app_packages as site directory: %S\n", app_packages_path_str); + + module = PyImport_ImportModule("site"); + if (module == NULL) { + // crash_dialog("Could not import site module"); + exit(-8); + } + + module_attr = PyObject_GetAttrString(module, "addsitedir"); + if (module_attr == NULL || !PyCallable_Check(module_attr)) { + // crash_dialog("Could not access site.addsitedir"); + exit(-9); + } + + app_packages_path = PyUnicode_FromWideChar(app_packages_path_str, wcslen(app_packages_path_str)); + if (app_packages_path == NULL) { + //crash_dialog("Could not convert app_packages path to unicode"); + exit(-10); + } + PyMem_RawFree(app_packages_path_str); + + method_args = Py_BuildValue("(O)", app_packages_path); + if (method_args == NULL) { + // crash_dialog("Could not create arguments for site.addsitedir"); + exit(-11); + } + + result = PyObject_CallObject(module_attr, method_args); + if (result == NULL) { + // crash_dialog("Could not add app_packages directory using site.addsitedir"); + exit(-12); + } + + // Start the app module. // // From here to Py_ObjectCall(runmodule...) is effectively From e6e4abb517f522246e1d3b4559d2b48c776bf27a Mon Sep 17 00:00:00 2001 From: Tim Rid <6593626+timrid@users.noreply.github.com> Date: Fri, 21 Mar 2025 21:48:02 +0100 Subject: [PATCH 2/3] fixed pre-commit errors --- {{ cookiecutter.format }}/bootstrap/main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/{{ cookiecutter.format }}/bootstrap/main.c b/{{ cookiecutter.format }}/bootstrap/main.c index e019a9b..c56d2f6 100644 --- a/{{ cookiecutter.format }}/bootstrap/main.c +++ b/{{ cookiecutter.format }}/bootstrap/main.c @@ -184,13 +184,13 @@ int main(int argc, char *argv[]) { // crash_dialog("Could not import site module"); exit(-8); } - + module_attr = PyObject_GetAttrString(module, "addsitedir"); if (module_attr == NULL || !PyCallable_Check(module_attr)) { // crash_dialog("Could not access site.addsitedir"); exit(-9); } - + app_packages_path = PyUnicode_FromWideChar(app_packages_path_str, wcslen(app_packages_path_str)); if (app_packages_path == NULL) { //crash_dialog("Could not convert app_packages path to unicode"); From 0ab9f394a39cac3d77d2cabfb5b226e28fd6bf33 Mon Sep 17 00:00:00 2001 From: Tim Rid <6593626+timrid@users.noreply.github.com> Date: Sat, 22 Mar 2025 12:35:11 +0100 Subject: [PATCH 3/3] synchronize exit codes with templates for other platforms --- {{ cookiecutter.format }}/bootstrap/main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/{{ cookiecutter.format }}/bootstrap/main.c b/{{ cookiecutter.format }}/bootstrap/main.c index c56d2f6..096638b 100644 --- a/{{ cookiecutter.format }}/bootstrap/main.c +++ b/{{ cookiecutter.format }}/bootstrap/main.c @@ -182,32 +182,32 @@ int main(int argc, char *argv[]) { module = PyImport_ImportModule("site"); if (module == NULL) { // crash_dialog("Could not import site module"); - exit(-8); + exit(-11); } module_attr = PyObject_GetAttrString(module, "addsitedir"); if (module_attr == NULL || !PyCallable_Check(module_attr)) { // crash_dialog("Could not access site.addsitedir"); - exit(-9); + exit(-12); } app_packages_path = PyUnicode_FromWideChar(app_packages_path_str, wcslen(app_packages_path_str)); if (app_packages_path == NULL) { //crash_dialog("Could not convert app_packages path to unicode"); - exit(-10); + exit(-13); } PyMem_RawFree(app_packages_path_str); method_args = Py_BuildValue("(O)", app_packages_path); if (method_args == NULL) { // crash_dialog("Could not create arguments for site.addsitedir"); - exit(-11); + exit(-14); } result = PyObject_CallObject(module_attr, method_args); if (result == NULL) { // crash_dialog("Could not add app_packages directory using site.addsitedir"); - exit(-12); + exit(-15); }