/* * Once init'ed, you might want to extractBinaries() * If you do, what comes after is very platform specific. * Once you've taken care of the platform specific details, * or if there are no binaries to extract, you go on * to pyi_launch_execute(), which is the important part. */ int pyi_launch_execute(ARCHIVE_STATUS *status, int argc, char *argv[]) { int rc = 0; /* Load Python DLL */ if (pyi_pylib_load(status)) { return -1; } else { /* With this flag Python cleanup will be called. */ status->is_pylib_loaded = true; } /* Start Python. */ if (pyi_pylib_start_python(status, argc, argv)) return -1; /* Import modules from archive - bootstrap */ if (pyi_pylib_import_modules(status)) return -1; /* Install zlibs - now all hooks in place */ if (pyi_pylib_install_zlibs(status)) return -1; /* Run scripts */ rc = pyi_pylib_run_scripts(status); VS("LOADER: OK.\n"); return rc; }
/* * Once init'ed, you might want to extractBinaries() * If you do, what comes after is very platform specific. * Once you've taken care of the platform specific details, * or if there are no binaries to extract, you go on * to pyi_launch_execute(), which is the important part. */ int pyi_launch_execute(ARCHIVE_STATUS *status) { int rc = 0; /* Load Python DLL */ if (pyi_pylib_load(status)) { return -1; } else { /* With this flag Python cleanup will be called. */ status->is_pylib_loaded = true; } /* Start Python. */ if (pyi_pylib_start_python(status)) { return -1; } /* Import core pyinstaller modules from the executable - bootstrap */ if (pyi_pylib_import_modules(status)) { return -1; } /* Install zlibs - now all hooks in place */ if (pyi_pylib_install_zlibs(status)) { return -1; } #ifndef WIN32 /* * On Linux sys.getfilesystemencoding() returns None but should not. * If it's None(NULL), get the filesystem encoding by using direct * C calls and override it with correct value. * * TODO: This may not be needed any more. Please confirm on Linux. */ if (!*PI_Py_FileSystemDefaultEncoding) { char *saved_locale, *loc_codeset; saved_locale = strdup(setlocale(LC_CTYPE, NULL)); VS("LOADER: LC_CTYPE was %s but resulted in NULL FileSystemDefaultEncoding\n", saved_locale); setlocale(LC_CTYPE, ""); loc_codeset = nl_langinfo(CODESET); setlocale(LC_CTYPE, saved_locale); free(saved_locale); VS("LOADER: Setting FileSystemDefaultEncoding to %s (was NULL)\n", loc_codeset); *PI_Py_FileSystemDefaultEncoding = loc_codeset; } #endif /* WIN32 */ /* Run scripts */ rc = pyi_launch_run_scripts(status); VS("LOADER: OK.\n"); return rc; }
/* * Once init'ed, you might want to extractBinaries() * If you do, what comes after is very platform specific. * Once you've taken care of the platform specific details, * or if there are no binaries to extract, you go on * to pyi_launch_execute(), which is the important part. */ int pyi_launch_execute(ARCHIVE_STATUS *status, int argc, char *argv[]) { int rc = 0; /* Load Python DLL */ if (pyi_pylib_load(status)) { return -1; } else { /* With this flag Python cleanup will be called. */ status->is_pylib_loaded = true; } /* Start Python. */ if (pyi_pylib_start_python(status, argc, argv)) return -1; /* Import modules from archive - bootstrap */ if (pyi_pylib_import_modules(status)) return -1; /* Install zlibs - now all hooks in place */ if (pyi_pylib_install_zlibs(status)) return -1; /* * On Linux sys.getfilesystemencoding() returns None but should not. * If it's None(NULL), get the filesystem encoding by using direct * C calls and override it with correct value. */ if (!*PI_Py_FileSystemDefaultEncoding) { char *saved_locale, *loc_codeset; saved_locale = strdup(setlocale(LC_CTYPE, NULL)); setlocale(LC_CTYPE, ""); loc_codeset = nl_langinfo(CODESET); setlocale(LC_CTYPE, saved_locale); free(saved_locale); *PI_Py_FileSystemDefaultEncoding = loc_codeset; } /* Run scripts */ rc = pyi_pylib_run_scripts(status); VS("LOADER: OK.\n"); return rc; }
int launch(ARCHIVE_STATUS *status, char const * archivePath, char const * archiveName) { PyObject *obHandle; int loadedNew = 0; char pathnm[PATH_MAX]; VS("START"); strcpy(pathnm, archivePath); strcat(pathnm, archiveName); /* Set up paths */ if (pyi_arch_set_paths(status, archivePath, archiveName)) return -1; VS("Got Paths"); /* Open the archive */ if (pyi_arch_open(status)) return -1; VS("Opened Archive"); /* Load Python DLL */ if (pyi_pylib_attach(status, &loadedNew)) return -1; if (loadedNew) { /* Start Python with silly command line */ PI_PyEval_InitThreads(); if (pyi_pylib_start_python(status)) return -1; VS("Started new Python"); thisthread = PI_PyThreadState_Swap(NULL); PI_PyThreadState_Swap(thisthread); } else { VS("Attached to existing Python"); /* start a mew interp */ thisthread = PI_PyThreadState_Swap(NULL); PI_PyThreadState_Swap(thisthread); if (thisthread == NULL) { thisthread = PI_Py_NewInterpreter(); VS("created thisthread"); } else VS("grabbed thisthread"); PI_PyRun_SimpleString("import sys;sys.argv=[]"); } /* a signal to scripts */ PI_PyRun_SimpleString("import sys;sys.frozen='dll'\n"); VS("set sys.frozen"); /* Create a 'frozendllhandle' as a counterpart to sys.dllhandle (which is the Pythonxx.dll handle) */ obHandle = PI_Py_BuildValue("i", gInstance); PI_PySys_SetObject("frozendllhandle", obHandle); Py_XDECREF(obHandle); /* Import modules from archive - this is to bootstrap */ if (pyi_pylib_import_modules(status)) return -1; VS("Imported Modules"); /* Install zlibs - now import hooks are in place */ if (pyi_pylib_install_zlibs(status)) return -1; VS("Installed Zlibs"); /* Run scripts */ if (pyi_launch_run_scripts(status)) return -1; VS("All scripts run"); if (PI_PyErr_Occurred()) { // PI_PyErr_Print(); //PI_PyErr_Clear(); VS("Some error occurred"); } VS("PGL released"); // Abandon our thread state. PI_PyEval_ReleaseThread(thisthread); VS("OK."); return 0; }