mirror of
				https://github.com/python/cpython.git
				synced 2025-11-02 22:51:25 +00:00 
			
		
		
		
	When I added _PyInterpreterState_IsRunningMain() and friends last year, I tried to accommodate applications that embed Python but don't call _PyInterpreterState_SetRunningMain() (not that they're expected to). That mostly worked fine until my recent changes in gh-117049, where the subtleties with the fallback code led to failures; the change ended up breaking test_tools.test_freeze, which exercises a basic embedding situation. The simplest fix is to drop the fallback code I originally added to _PyInterpreterState_IsRunningMain() (and later to _PyThreadState_IsRunningMain()). I've kept the fallback in the _xxsubinterpreters module though. I've also updated Py_FrozenMain() to call _PyInterpreterState_SetRunningMain().
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* Python interpreter main program for frozen scripts */
 | 
						|
 | 
						|
#include "Python.h"
 | 
						|
#include "pycore_pystate.h"       // _Py_GetConfig()
 | 
						|
#include "pycore_runtime.h"       // _PyRuntime_Initialize()
 | 
						|
 | 
						|
#ifdef HAVE_UNISTD_H
 | 
						|
#  include <unistd.h>             // isatty()
 | 
						|
#endif
 | 
						|
 | 
						|
 | 
						|
#ifdef MS_WINDOWS
 | 
						|
extern void PyWinFreeze_ExeInit(void);
 | 
						|
extern void PyWinFreeze_ExeTerm(void);
 | 
						|
extern int PyInitFrozenExtensions(void);
 | 
						|
#endif
 | 
						|
 | 
						|
/* Main program */
 | 
						|
 | 
						|
int
 | 
						|
Py_FrozenMain(int argc, char **argv)
 | 
						|
{
 | 
						|
    PyStatus status = _PyRuntime_Initialize();
 | 
						|
    if (PyStatus_Exception(status)) {
 | 
						|
        Py_ExitStatusException(status);
 | 
						|
    }
 | 
						|
 | 
						|
    PyConfig config;
 | 
						|
    PyConfig_InitPythonConfig(&config);
 | 
						|
    // Suppress errors from getpath.c
 | 
						|
    config.pathconfig_warnings = 0;
 | 
						|
    // Don't parse command line options like -E
 | 
						|
    config.parse_argv = 0;
 | 
						|
 | 
						|
    status = PyConfig_SetBytesArgv(&config, argc, argv);
 | 
						|
    if (PyStatus_Exception(status)) {
 | 
						|
        PyConfig_Clear(&config);
 | 
						|
        Py_ExitStatusException(status);
 | 
						|
    }
 | 
						|
 | 
						|
    const char *p;
 | 
						|
    int inspect = 0;
 | 
						|
    if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0') {
 | 
						|
        inspect = 1;
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef MS_WINDOWS
 | 
						|
    PyInitFrozenExtensions();
 | 
						|
#endif /* MS_WINDOWS */
 | 
						|
 | 
						|
    status = Py_InitializeFromConfig(&config);
 | 
						|
    PyConfig_Clear(&config);
 | 
						|
    if (PyStatus_Exception(status)) {
 | 
						|
        Py_ExitStatusException(status);
 | 
						|
    }
 | 
						|
 | 
						|
    PyInterpreterState *interp = PyInterpreterState_Get();
 | 
						|
    if (_PyInterpreterState_SetRunningMain(interp) < 0) {
 | 
						|
        PyErr_Print();
 | 
						|
        exit(1);
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef MS_WINDOWS
 | 
						|
    PyWinFreeze_ExeInit();
 | 
						|
#endif
 | 
						|
 | 
						|
    if (_Py_GetConfig()->verbose) {
 | 
						|
        fprintf(stderr, "Python %s\n%s\n",
 | 
						|
                Py_GetVersion(), Py_GetCopyright());
 | 
						|
    }
 | 
						|
 | 
						|
    int sts = 1;
 | 
						|
    int n = PyImport_ImportFrozenModule("__main__");
 | 
						|
    if (n == 0) {
 | 
						|
        Py_FatalError("the __main__ module is not frozen");
 | 
						|
    }
 | 
						|
    if (n < 0) {
 | 
						|
        PyErr_Print();
 | 
						|
        sts = 1;
 | 
						|
    }
 | 
						|
    else {
 | 
						|
        sts = 0;
 | 
						|
    }
 | 
						|
 | 
						|
    if (inspect && isatty((int)fileno(stdin))) {
 | 
						|
        sts = PyRun_AnyFile(stdin, "<stdin>") != 0;
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef MS_WINDOWS
 | 
						|
    PyWinFreeze_ExeTerm();
 | 
						|
#endif
 | 
						|
 | 
						|
    _PyInterpreterState_SetNotRunningMain(interp);
 | 
						|
 | 
						|
    if (Py_FinalizeEx() < 0) {
 | 
						|
        sts = 120;
 | 
						|
    }
 | 
						|
    return sts;
 | 
						|
}
 |