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")) {

`