Interpreter initialization and finalization¶
SeePython Initialization Configuration for detailson how to configure the interpreter prior to initialization.
Before Python initialization¶
In an application embedding Python, thePy_Initialize() function mustbe called before using any other Python/C API functions; with the exception ofa few functions and theglobal configuration variables.
The following functions can be safely called before Python is initialized:
Functions that initialize the interpreter:
the runtime pre-initialization functions covered inPython Initialization Configuration
Configuration functions:
PyInitFrozenExtensions()the configuration functions covered inPython Initialization Configuration
Informative functions:
Utilities:
the status reporting and utility functions covered inPython Initialization Configuration
Memory allocators:
Synchronization:
Note
Despite their apparent similarity to some of the functions listed above,the following functionsshould not be called before the interpreter hasbeen initialized:Py_EncodeLocale(),PyEval_InitThreads(), andPy_RunMain().
Global configuration variables¶
Python has variables for the global configuration to control different featuresand options. By default, these flags are controlled bycommand lineoptions.
When a flag is set by an option, the value of the flag is the number of timesthat the option was set. For example,-b setsPy_BytesWarningFlagto 1 and-bb setsPy_BytesWarningFlag to 2.
- intPy_BytesWarningFlag¶
This API is kept for backward compatibility: setting
PyConfig.bytes_warningshould be used instead, seePythonInitialization Configuration.Issue a warning when comparing
bytesorbytearraywithstrorbyteswithint. Issue an error if greateror equal to2.Set by the
-boption.Deprecated since version 3.12, removed in version 3.15.
- intPy_DebugFlag¶
This API is kept for backward compatibility: setting
PyConfig.parser_debugshould be used instead, seePythonInitialization Configuration.Turn on parser debugging output (for expert only, depending on compilationoptions).
Set by the
-doption and thePYTHONDEBUGenvironmentvariable.Deprecated since version 3.12, removed in version 3.15.
- intPy_DontWriteBytecodeFlag¶
This API is kept for backward compatibility: setting
PyConfig.write_bytecodeshould be used instead, seePythonInitialization Configuration.If set to non-zero, Python won’t try to write
.pycfiles on theimport of source modules.Set by the
-Boption and thePYTHONDONTWRITEBYTECODEenvironment variable.Deprecated since version 3.12, removed in version 3.15.
- intPy_FrozenFlag¶
This API is kept for backward compatibility: setting
PyConfig.pathconfig_warningsshould be used instead, seePython Initialization Configuration.Private flag used by
_freeze_moduleandfrozenmainprograms.Deprecated since version 3.12, removed in version 3.15.
- intPy_HashRandomizationFlag¶
This API is kept for backward compatibility: setting
PyConfig.hash_seedandPyConfig.use_hash_seedshouldbe used instead, seePython Initialization Configuration.Set to
1if thePYTHONHASHSEEDenvironment variable is set toa non-empty string.If the flag is non-zero, read the
PYTHONHASHSEEDenvironmentvariable to initialize the secret hash seed.Deprecated since version 3.12, removed in version 3.15.
- intPy_IgnoreEnvironmentFlag¶
This API is kept for backward compatibility: setting
PyConfig.use_environmentshould be used instead, seePython Initialization Configuration.Ignore all
PYTHON*environment variables, e.g.PYTHONPATHandPYTHONHOME, that might be set.Deprecated since version 3.12, removed in version 3.15.
- intPy_InspectFlag¶
This API is kept for backward compatibility: setting
PyConfig.inspectshould be used instead, seePython Initialization Configuration.When a script is passed as first argument or the
-coption is used,enter interactive mode after executing the script or the command, even whensys.stdindoes not appear to be a terminal.Set by the
-ioption and thePYTHONINSPECTenvironmentvariable.Deprecated since version 3.12, removed in version 3.15.
- intPy_InteractiveFlag¶
This API is kept for backward compatibility: setting
PyConfig.interactiveshould be used instead, seePython Initialization Configuration.Set by the
-ioption.Deprecated since version 3.12, removed in version 3.15.
- intPy_IsolatedFlag¶
This API is kept for backward compatibility: setting
PyConfig.isolatedshould be used instead, seePython Initialization Configuration.Run Python in isolated mode. In isolated mode
sys.pathcontainsneither the script’s directory nor the user’s site-packages directory.Set by the
-Ioption.Added in version 3.4.
Deprecated since version 3.12, removed in version 3.15.
- intPy_LegacyWindowsFSEncodingFlag¶
This API is kept for backward compatibility: setting
PyPreConfig.legacy_windows_fs_encodingshould be used instead, seePython Initialization Configuration.If the flag is non-zero, use the
mbcsencoding withreplaceerrorhandler, instead of the UTF-8 encoding withsurrogatepasserror handler,for thefilesystem encoding and error handler.Set to
1if thePYTHONLEGACYWINDOWSFSENCODINGenvironmentvariable is set to a non-empty string.SeePEP 529 for more details.
Availability: Windows.
Deprecated since version 3.12, removed in version 3.15.
- intPy_LegacyWindowsStdioFlag¶
This API is kept for backward compatibility: setting
PyConfig.legacy_windows_stdioshould be used instead, seePython Initialization Configuration.If the flag is non-zero, use
io.FileIOinstead ofio._WindowsConsoleIOforsysstandard streams.Set to
1if thePYTHONLEGACYWINDOWSSTDIOenvironmentvariable is set to a non-empty string.SeePEP 528 for more details.
Availability: Windows.
Deprecated since version 3.12, removed in version 3.15.
- intPy_NoSiteFlag¶
This API is kept for backward compatibility: setting
PyConfig.site_importshould be used instead, seePython Initialization Configuration.Disable the import of the module
siteand the site-dependentmanipulations ofsys.paththat it entails. Also disable thesemanipulations ifsiteis explicitly imported later (callsite.main()if you want them to be triggered).Set by the
-Soption.Deprecated since version 3.12, removed in version 3.15.
- intPy_NoUserSiteDirectory¶
This API is kept for backward compatibility: setting
PyConfig.user_site_directoryshould be used instead, seePython Initialization Configuration.Don’t add the
usersite-packagesdirectorytosys.path.Set by the
-sand-Ioptions, and thePYTHONNOUSERSITEenvironment variable.Deprecated since version 3.12, removed in version 3.15.
- intPy_OptimizeFlag¶
This API is kept for backward compatibility: setting
PyConfig.optimization_levelshould be used instead, seePython Initialization Configuration.Set by the
-Ooption and thePYTHONOPTIMIZEenvironmentvariable.Deprecated since version 3.12, removed in version 3.15.
- intPy_QuietFlag¶
This API is kept for backward compatibility: setting
PyConfig.quietshould be used instead, seePythonInitialization Configuration.Don’t display the copyright and version messages even in interactive mode.
Set by the
-qoption.Added in version 3.2.
Deprecated since version 3.12, removed in version 3.15.
- intPy_UnbufferedStdioFlag¶
This API is kept for backward compatibility: setting
PyConfig.buffered_stdioshould be used instead, seePythonInitialization Configuration.Force the stdout and stderr streams to be unbuffered.
Set by the
-uoption and thePYTHONUNBUFFEREDenvironment variable.Deprecated since version 3.12, removed in version 3.15.
- intPy_VerboseFlag¶
This API is kept for backward compatibility: setting
PyConfig.verboseshould be used instead, seePythonInitialization Configuration.Print a message each time a module is initialized, showing the place(filename or built-in module) from which it is loaded. If greater or equalto
2, print a message for each file that is checked for whensearching for a module. Also provides information on module cleanup at exit.Set by the
-voption and thePYTHONVERBOSEenvironmentvariable.Deprecated since version 3.12, removed in version 3.15.
Initializing and finalizing the interpreter¶
- voidPy_Initialize()¶
- Part of theStable ABI.
Initialize the Python interpreter. In an application embedding Python,this should be called before using any other Python/C API functions; seeBefore Python Initialization for the few exceptions.
This initializes the table of loaded modules (
sys.modules), and createsthe fundamental modulesbuiltins,__main__andsys.It also initializes the module search path (sys.path). It does not setsys.argv; use thePython Initialization ConfigurationAPI for that. This is a no-op when called for a second time (without callingPy_FinalizeEx()first). There is no return value; it is a fatalerror if the initialization fails.Use
Py_InitializeFromConfig()to customize thePython Initialization Configuration.Note
On Windows, changes the console mode from
O_TEXTtoO_BINARY,which will also affect non-Python uses of the console using the C Runtime.
- voidPy_InitializeEx(intinitsigs)¶
- Part of theStable ABI.
This function works like
Py_Initialize()ifinitsigs is1. Ifinitsigs is0, it skips initialization registration of signal handlers,which may be useful when CPython is embedded as part of a larger application.Use
Py_InitializeFromConfig()to customize thePython Initialization Configuration.
- PyStatusPy_InitializeFromConfig(constPyConfig*config)¶
Initialize Python fromconfig configuration, as described inInitialization with PyConfig.
See thePython Initialization Configuration section for details on pre-initializing theinterpreter, populating the runtime configuration structure, and queryingthe returned status structure.
- intPy_IsInitialized()¶
- Part of theStable ABI.
Return true (nonzero) when the Python interpreter has been initialized, false(zero) if not. After
Py_FinalizeEx()is called, this returns false untilPy_Initialize()is called again.
- intPy_IsFinalizing()¶
- Part of theStable ABI since version 3.13.
Return true (non-zero) if the main Python interpreter isshutting down. Return false (zero) otherwise.
Added in version 3.13.
- intPy_FinalizeEx()¶
- Part of theStable ABI since version 3.6.
Undo all initializations made by
Py_Initialize()and subsequent use ofPython/C API functions, and destroy all sub-interpreters (seePy_NewInterpreter()below) that were created and not yet destroyed sincethe last call toPy_Initialize(). This is a no-op when called for a secondtime (without callingPy_Initialize()again first).Since this is the reverse of
Py_Initialize(), it should be calledin the same thread with the same interpreter active. That meansthe main thread and the main interpreter.This should never be called whilePy_RunMain()is running.Normally the return value is
0.If there were errors during finalization (flushing buffered data),-1is returned.Note that Python will do a best effort at freeing all memory allocated by the Pythoninterpreter. Therefore, any C-Extension should make sure to correctly clean up allof the previously allocated PyObjects before using them in subsequent calls to
Py_Initialize(). Otherwise it could introduce vulnerabilities and incorrectbehavior.This function is provided for a number of reasons. An embedding applicationmight want to restart Python without having to restart the application itself.An application that has loaded the Python interpreter from a dynamicallyloadable library (or DLL) might want to free all memory allocated by Pythonbefore unloading the DLL. During a hunt for memory leaks in an application adeveloper might want to free all memory allocated by Python before exiting fromthe application.
Bugs and caveats: The destruction of modules and objects in modules is donein random order; this may cause destructors (
__del__()methods) to failwhen they depend on other objects (even functions) or modules. Dynamicallyloaded extension modules loaded by Python are not unloaded. Small amounts ofmemory allocated by the Python interpreter may not be freed (if you find a leak,please report it). Memory tied up in circular references between objects is notfreed. Interned strings will all be deallocated regardless of their reference count.Some memory allocated by extension modules may not be freed. Some extensions may notwork properly if their initialization routine is called more than once; this canhappen if an application callsPy_Initialize()andPy_FinalizeEx()more than once.Py_FinalizeEx()must not be called recursively fromwithin itself. Therefore, it must not be called by any code that may be runas part of the interpreter shutdown process, such asatexithandlers, object finalizers, or any code that may be run while flushing thestdout and stderr files.Raises anauditing event
cpython._PySys_ClearAuditHookswith no arguments.Added in version 3.6.
- voidPy_Finalize()¶
- Part of theStable ABI.
This is a backwards-compatible version of
Py_FinalizeEx()thatdisregards the return value.
- intPy_BytesMain(intargc,char**argv)¶
- Part of theStable ABI since version 3.8.
Similar to
Py_Main()butargv is an array of bytes strings,allowing the calling application to delegate the text decoding step tothe CPython runtime.Added in version 3.8.
- intPy_Main(intargc,wchar_t**argv)¶
- Part of theStable ABI.
The main program for the standard interpreter, encapsulating a fullinitialization/finalization cycle, as well as additionalbehaviour to implement reading configurations settings from the environmentand command line, and then executing
__main__in accordance withCommand line.This is made available for programs which wish to support the full CPythoncommand line interface, rather than just embedding a Python runtime in alarger application.
Theargc andargv parameters are similar to those which are passed to aC program’s
main()function, except that theargv entries are firstconverted towchar_tusingPy_DecodeLocale(). It is alsoimportant to note that the argument list entries may be modified to point tostrings other than those passed in (however, the contents of the stringspointed to by the argument list are not modified).The return value is
2if the argument list does not represent a validPython command line, and otherwise the same asPy_RunMain().In terms of the CPython runtime configuration APIs documented in theruntime configuration section (and without accountingfor error handling),
Py_Mainis approximately equivalent to:PyConfigconfig;PyConfig_InitPythonConfig(&config);PyConfig_SetArgv(&config,argc,argv);Py_InitializeFromConfig(&config);PyConfig_Clear(&config);Py_RunMain();
In normal usage, an embedding application will call this functioninstead of calling
Py_Initialize(),Py_InitializeEx()orPy_InitializeFromConfig()directly, and all settings will be appliedas described elsewhere in this documentation. If this function is insteadcalledafter a preceding runtime initialization API call, then exactlywhich environmental and command line configuration settings will be updatedis version dependent (as it depends on which settings correctly supportbeing modified after they have already been set once when the runtime wasfirst initialized).
- intPy_RunMain(void)¶
Executes the main module in a fully configured CPython runtime.
Executes the command (
PyConfig.run_command), the script(PyConfig.run_filename) or the module(PyConfig.run_module) specified on the command line or in theconfiguration. If none of these values are set, runs the interactive Pythonprompt (REPL) using the__main__module’s global namespace.If
PyConfig.inspectis not set (the default), the return valuewill be0if the interpreter exits normally (that is, without raisingan exception), the exit status of an unhandledSystemExit, or1for any other unhandled exception.If
PyConfig.inspectis set (such as when the-ioptionis used), rather than returning when the interpreter exits, execution willinstead resume in an interactive Python prompt (REPL) using the__main__module’s global namespace. If the interpreter exited with an exception, itis immediately raised in the REPL session. The function return value isthen determined by the way theREPL session terminates:0,1, orthe status of aSystemExit, as specified above.This function always finalizes the Python interpreter before it returns.
SeePython Configuration for an example of acustomized Python that always runs in isolated mode using
Py_RunMain().
- intPyUnstable_AtExit(PyInterpreterState*interp,void(*func)(void*),void*data)¶
- This isUnstable API. It may change without warning in minor releases.
Register an
atexitcallback for the target interpreterinterp.This is similar toPy_AtExit(), but takes an explicit interpreter anddata pointer for the callback.There must be anattached thread state forinterp.
Added in version 3.13.
Cautions regarding runtime finalization¶
In the late stage ofinterpreter shutdown, after attempting to wait fornon-daemon threads to exit (though this can be interrupted byKeyboardInterrupt) and running theatexit functions, the runtimeis marked asfinalizing:Py_IsFinalizing() andsys.is_finalizing() return true. At this point, only thefinalizationthread that initiated finalization (typically the main thread) is allowed toacquire theGIL.
If any thread, other than the finalization thread, attempts to attach athread stateduring finalization, either explicitly orimplicitly, the thread entersa permanently blocked statewhere it remains until the program exits. In most cases this is harmless, but this can resultin deadlock if a later stage of finalization attempts to acquire a lock owned by theblocked thread, or otherwise waits on the blocked thread.
Gross? Yes. This prevents random crashes and/or unexpectedly skipped C++finalizations further up the call stack when such threads were forcibly exitedhere in CPython 3.13 and earlier. The CPython runtimethread state C APIshave never had any error reporting or handling expectations atthread stateattachment time that would’ve allowed for graceful exit from this situation. Changing thatwould require new stable C APIs and rewriting the majority of C code in theCPython ecosystem to use those with error handling.
Process-wide parameters¶
- voidPy_SetProgramName(constwchar_t*name)¶
- Part of theStable ABI.
This API is kept for backward compatibility: setting
PyConfig.program_nameshould be used instead, seePythonInitialization Configuration.This function should be called before
Py_Initialize()is called forthe first time, if it is called at all. It tells the interpreter the valueof theargv[0]argument to themain()function of the program(converted to wide characters).This is used by some other functions below to findthe Python run-time libraries relative to the interpreter executable. Thedefault value is'python'. The argument should point to azero-terminated wide character string in static storage whose contents will notchange for the duration of the program’s execution. No code in the Pythoninterpreter will change the contents of this storage.Use
Py_DecodeLocale()to decode a bytes string to get awchar_t* string.Deprecated since version 3.11, removed in version 3.15.
- constchar*Py_GetVersion()¶
- Part of theStable ABI.
Return the version of this Python interpreter. This is a string that lookssomething like
"3.0a5+ (py3k:63103M, May 12 2008, 00:53:55)\n[GCC 4.2.3]"
The first word (up to the first space character) is the current Python version;the first characters are the major and minor version separated by aperiod. The returned string points into static storage; the caller should notmodify its value. The value is available to Python code as
sys.version.See also the
Py_Versionconstant.
- constchar*Py_GetPlatform()¶
- Part of theStable ABI.
Return the platform identifier for the current platform. On Unix, this isformed from the “official” name of the operating system, converted to lowercase, followed by the major revision number; e.g., for Solaris 2.x, which isalso known as SunOS 5.x, the value is
'sunos5'. On macOS, it is'darwin'. On Windows, it is'win'. The returned string points intostatic storage; the caller should not modify its value. The value is availableto Python code assys.platform.
- constchar*Py_GetCopyright()¶
- Part of theStable ABI.
Return the official copyright string for the current Python version, for example
'Copyright1991-1995StichtingMathematischCentrum,Amsterdam'The returned string points into static storage; the caller should not modify itsvalue. The value is available to Python code as
sys.copyright.
- constchar*Py_GetCompiler()¶
- Part of theStable ABI.
Return an indication of the compiler used to build the current Python version,in square brackets, for example:
"[GCC 2.7.2.2]"The returned string points into static storage; the caller should not modify itsvalue. The value is available to Python code as part of the variable
sys.version.
- constchar*Py_GetBuildInfo()¶
- Part of theStable ABI.
Return information about the sequence number and build date and time of thecurrent Python interpreter instance, for example
"#67, Aug 1 1997, 22:34:28"The returned string points into static storage; the caller should not modify itsvalue. The value is available to Python code as part of the variable
sys.version.
- voidPySys_SetArgvEx(intargc,wchar_t**argv,intupdatepath)¶
- Part of theStable ABI.
This API is kept for backward compatibility: setting
PyConfig.argv,PyConfig.parse_argvandPyConfig.safe_pathshould be used instead, seePythonInitialization Configuration.Set
sys.argvbased onargc andargv. These parameters aresimilar to those passed to the program’smain()function with thedifference that the first entry should refer to the script file to beexecuted rather than the executable hosting the Python interpreter. If thereisn’t a script that will be run, the first entry inargv can be an emptystring. If this function fails to initializesys.argv, a fatalcondition is signalled usingPy_FatalError().Ifupdatepath is zero, this is all the function does. Ifupdatepathis non-zero, the function also modifies
sys.pathaccording to thefollowing algorithm:If the name of an existing script is passed in
argv[0], the absolutepath of the directory where the script is located is prepended tosys.path.Otherwise (that is, ifargc is
0orargv[0]doesn’t pointto an existing file name), an empty string is prepended tosys.path, which is the same as prepending the current workingdirectory (".").
Use
Py_DecodeLocale()to decode a bytes string to get awchar_t* string.See also
PyConfig.orig_argvandPyConfig.argvmembers of thePython Initialization Configuration.Note
It is recommended that applications embedding the Python interpreterfor purposes other than executing a single script pass
0asupdatepath,and updatesys.paththemselves if desired.SeeCVE 2008-5983.On versions before 3.1.3, you can achieve the same effect by manuallypopping the first
sys.pathelement after having calledPySys_SetArgv(), for example using:PyRun_SimpleString("import sys; sys.path.pop(0)\n");
Added in version 3.1.3.
Deprecated since version 3.11, removed in version 3.15.
- voidPySys_SetArgv(intargc,wchar_t**argv)¶
- Part of theStable ABI.
This API is kept for backward compatibility: setting
PyConfig.argvandPyConfig.parse_argvshould be usedinstead, seePython Initialization Configuration.This function works like
PySys_SetArgvEx()withupdatepath setto1unless thepython interpreter was started with the-I.Use
Py_DecodeLocale()to decode a bytes string to get awchar_t* string.See also
PyConfig.orig_argvandPyConfig.argvmembers of thePython Initialization Configuration.Changed in version 3.4:Theupdatepath value depends on
-I.Deprecated since version 3.11, removed in version 3.15.
- voidPy_SetPythonHome(constwchar_t*home)¶
- Part of theStable ABI.
This API is kept for backward compatibility: setting
PyConfig.homeshould be used instead, seePythonInitialization Configuration.Set the default “home” directory, that is, the location of the standardPython libraries. See
PYTHONHOMEfor the meaning of theargument string.The argument should point to a zero-terminated character string in staticstorage whose contents will not change for the duration of the program’sexecution. No code in the Python interpreter will change the contents ofthis storage.
Use
Py_DecodeLocale()to decode a bytes string to get awchar_t* string.Deprecated since version 3.11, removed in version 3.15.