bpo-34725: Adds _Py_SetProgramFullPath so embedders may override sys.executable (GH-9861)

This commit is contained in:
Steve Dower 2018-11-17 20:42:08 -08:00 committed by GitHub
parent d1a97b3659
commit e851049e0e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 50 additions and 0 deletions

View File

@ -44,6 +44,8 @@ PyAPI_FUNC(void) Py_SetPythonHome(const wchar_t *);
PyAPI_FUNC(wchar_t *) Py_GetPythonHome(void);
#ifndef Py_LIMITED_API
PyAPI_FUNC(void) _Py_SetProgramFullPath(const wchar_t *);
/* Only used by applications that embed the interpreter and need to
* override the standard encoding determination mechanism
*/

View File

@ -0,0 +1 @@
Adds _Py_SetProgramFullPath so embedders may override sys.executable

View File

@ -1206,6 +1206,25 @@ config_init_program_name(_PyCoreConfig *config)
}
static _PyInitError
config_init_executable(_PyCoreConfig *config)
{
assert(config->executable == NULL);
/* If Py_SetProgramFullPath() was called, use its value */
const wchar_t *program_full_path = _Py_path_config.program_full_path;
if (program_full_path != NULL) {
config->executable = _PyMem_RawWcsdup(program_full_path);
if (config->executable == NULL) {
return _Py_INIT_NO_MEMORY();
}
return _Py_INIT_OK();
}
return _Py_INIT_OK();
}
static void
pymain_header(_PyMain *pymain)
{
@ -2350,6 +2369,13 @@ _PyCoreConfig_Read(_PyCoreConfig *config)
}
}
if (config->executable == NULL) {
err = config_init_executable(config);
if (_Py_INIT_FAILED(err)) {
return err;
}
}
if (config->utf8_mode < 0 || config->coerce_c_locale < 0) {
config_init_locale(config);
}

View File

@ -205,6 +205,27 @@ Py_SetProgramName(const wchar_t *program_name)
}
void
_Py_SetProgramFullPath(const wchar_t *program_full_path)
{
if (program_full_path == NULL || program_full_path[0] == L'\0') {
return;
}
PyMemAllocatorEx old_alloc;
_PyMem_SetDefaultAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
PyMem_RawFree(_Py_path_config.program_full_path);
_Py_path_config.program_full_path = _PyMem_RawWcsdup(program_full_path);
PyMem_SetAllocator(PYMEM_DOMAIN_RAW, &old_alloc);
if (_Py_path_config.program_full_path == NULL) {
Py_FatalError("Py_SetProgramFullPath() failed: out of memory");
}
}
wchar_t *
Py_GetPath(void)
{