bpo-32030: Add _PyMainInterpreterConfig.pythonhome (#4513) · python/cpython@1f15111 (original) (raw)
`@@ -400,7 +400,6 @@ typedef struct {
`
400
400
`_PyInitError err;
`
401
401
`/* PYTHONWARNINGS env var */
`
402
402
`_Py_OptList env_warning_options;
`
403
``
`-
/* PYTHONPATH env var */
`
404
403
`int argc;
`
405
404
`wchar_t **argv;
`
406
405
`} _PyMain;
`
`@@ -1368,47 +1367,98 @@ pymain_set_flags_from_env(_PyMain *pymain)
`
1368
1367
``
1369
1368
``
1370
1369
`static int
`
1371
``
`-
pymain_init_pythonpath(_PyMain *pymain)
`
``
1370
`+
pymain_get_env_var_dup(_PyMain *pymain, wchar_t **dest,
`
``
1371
`+
wchar_t *wname, char *name)
`
1372
1372
`{
`
1373
1373
`if (Py_IgnoreEnvironmentFlag) {
`
``
1374
`+
*dest = NULL;
`
1374
1375
`return 0;
`
1375
1376
` }
`
1376
1377
``
1377
1378
`#ifdef MS_WINDOWS
`
1378
``
`-
wchar_t *path = _wgetenv(L"PYTHONPATH");
`
1379
``
`-
if (!path || path[0] == '\0') {
`
``
1379
`+
wchar_t *var = _wgetenv(wname);
`
``
1380
`+
if (!var || var[0] == '\0') {
`
``
1381
`+
*dest = NULL;
`
1380
1382
`return 0;
`
1381
1383
` }
`
1382
1384
``
1383
``
`-
wchar_t *path2 = pymain_wstrdup(pymain, path);
`
1384
``
`-
if (path2 == NULL) {
`
``
1385
`+
wchar_t *copy = pymain_wstrdup(pymain, var);
`
``
1386
`+
if (copy == NULL) {
`
1385
1387
`return -1;
`
1386
1388
` }
`
1387
1389
``
1388
``
`-
pymain->config.module_search_path_env = path2;
`
``
1390
`+
*dest = copy;
`
1389
1391
`#else
`
1390
``
`-
char *path = pymain_get_env_var("PYTHONPATH");
`
1391
``
`-
if (!path) {
`
``
1392
`+
char *var = getenv(name);
`
``
1393
`+
if (!var || var[0] == '\0') {
`
``
1394
`+
*dest = NULL;
`
1392
1395
`return 0;
`
1393
1396
` }
`
1394
1397
``
1395
1398
`size_t len;
`
1396
``
`-
wchar_t *wpath = Py_DecodeLocale(path, &len);
`
1397
``
`-
if (!wpath) {
`
``
1399
`+
wchar_t *wvar = Py_DecodeLocale(var, &len);
`
``
1400
`+
if (!wvar) {
`
1398
1401
`if (len == (size_t)-2) {
`
1399
``
`-
pymain->err = _Py_INIT_ERR("failed to decode PYTHONHOME");
`
``
1402
`+
/* don't set pymain->err */
`
``
1403
`+
return -2;
`
1400
1404
` }
`
1401
1405
`else {
`
1402
1406
`pymain->err = INIT_NO_MEMORY();
`
``
1407
`+
return -1;
`
1403
1408
` }
`
1404
``
`-
return -1;
`
1405
1409
` }
`
1406
``
`-
pymain->config.module_search_path_env = wpath;
`
``
1410
`+
*dest = wvar;
`
1407
1411
`#endif
`
1408
1412
`return 0;
`
1409
1413
`}
`
1410
1414
``
1411
1415
``
``
1416
`+
static int
`
``
1417
`+
pymain_init_pythonpath(_PyMain *pymain)
`
``
1418
`+
{
`
``
1419
`+
wchar_t *path;
`
``
1420
`+
int res = pymain_get_env_var_dup(pymain, &path,
`
``
1421
`+
L"PYTHONPATH", "PYTHONPATH");
`
``
1422
`+
if (res < 0) {
`
``
1423
`+
if (res == -2) {
`
``
1424
`+
pymain->err = _Py_INIT_ERR("failed to decode PYTHONPATH");
`
``
1425
`+
}
`
``
1426
`+
return -1;
`
``
1427
`+
}
`
``
1428
`+
pymain->config.module_search_path_env = path;
`
``
1429
`+
return 0;
`
``
1430
`+
}
`
``
1431
+
``
1432
+
``
1433
`+
static int
`
``
1434
`+
pymain_init_pythonhome(_PyMain *pymain)
`
``
1435
`+
{
`
``
1436
`+
wchar_t *home;
`
``
1437
+
``
1438
`+
home = Py_GetPythonHome();
`
``
1439
`+
if (home) {
`
``
1440
`+
/* Py_SetPythonHome() has been called before Py_Main(),
`
``
1441
`+
use its value */
`
``
1442
`+
pymain->config.pythonhome = pymain_wstrdup(pymain, home);
`
``
1443
`+
if (pymain->config.pythonhome == NULL) {
`
``
1444
`+
return -1;
`
``
1445
`+
}
`
``
1446
`+
return 0;
`
``
1447
`+
}
`
``
1448
+
``
1449
`+
int res = pymain_get_env_var_dup(pymain, &home,
`
``
1450
`+
L"PYTHONHOME", "PYTHONHOME");
`
``
1451
`+
if (res < 0) {
`
``
1452
`+
if (res == -2) {
`
``
1453
`+
pymain->err = _Py_INIT_ERR("failed to decode PYTHONHOME");
`
``
1454
`+
}
`
``
1455
`+
return -1;
`
``
1456
`+
}
`
``
1457
`+
pymain->config.pythonhome = home;
`
``
1458
`+
return 0;
`
``
1459
`+
}
`
``
1460
+
``
1461
+
1412
1462
`static int
`
1413
1463
`pymain_parse_envvars(_PyMain *pymain)
`
1414
1464
`{
`
`@@ -1433,6 +1483,9 @@ pymain_parse_envvars(_PyMain *pymain)
`
1433
1483
`if (pymain_init_pythonpath(pymain) < 0) {
`
1434
1484
`return -1;
`
1435
1485
` }
`
``
1486
`+
if (pymain_init_pythonhome(pymain) < 0) {
`
``
1487
`+
return -1;
`
``
1488
`+
}
`
1436
1489
``
1437
1490
`/* -X options */
`
1438
1491
`if (pymain_get_xoption(pymain, L"showrefcount")) {
`