@@ -400,7 +400,6 @@ typedef struct {
400400 _PyInitError err ;
401401 /* PYTHONWARNINGS env var */
402402 _Py_OptList env_warning_options ;
403- /* PYTHONPATH env var */
404403 int argc ;
405404 wchar_t * * argv ;
406405} _PyMain ;
@@ -1368,47 +1367,98 @@ pymain_set_flags_from_env(_PyMain *pymain)
13681367
13691368
13701369static int
1371- pymain_init_pythonpath (_PyMain * pymain )
1370+ pymain_get_env_var_dup (_PyMain * pymain , wchar_t * * dest ,
1371+ wchar_t * wname , char * name )
13721372{
13731373 if (Py_IgnoreEnvironmentFlag ) {
1374+ * dest = NULL ;
13741375 return 0 ;
13751376 }
13761377
13771378#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 ;
13801382 return 0 ;
13811383 }
13821384
1383- wchar_t * path2 = pymain_wstrdup (pymain , path );
1384- if (path2 == NULL ) {
1385+ wchar_t * copy = pymain_wstrdup (pymain , var );
1386+ if (copy == NULL ) {
13851387 return -1 ;
13861388 }
13871389
1388- pymain -> config . module_search_path_env = path2 ;
1390+ * dest = copy ;
13891391#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 ;
13921395 return 0 ;
13931396 }
13941397
13951398 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 ) {
13981401 if (len == (size_t )-2 ) {
1399- pymain -> err = _Py_INIT_ERR ("failed to decode PYTHONHOME" );
1402+ /* don't set pymain->err */
1403+ return -2 ;
14001404 }
14011405 else {
14021406 pymain -> err = INIT_NO_MEMORY ();
1407+ return -1 ;
14031408 }
1404- return -1 ;
14051409 }
1406- pymain -> config . module_search_path_env = wpath ;
1410+ * dest = wvar ;
14071411#endif
14081412 return 0 ;
14091413}
14101414
14111415
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+
14121462static int
14131463pymain_parse_envvars (_PyMain * pymain )
14141464{
@@ -1433,6 +1483,9 @@ pymain_parse_envvars(_PyMain *pymain)
14331483 if (pymain_init_pythonpath (pymain ) < 0 ) {
14341484 return -1 ;
14351485 }
1486+ if (pymain_init_pythonhome (pymain ) < 0 ) {
1487+ return -1 ;
1488+ }
14361489
14371490 /* -X options */
14381491 if (pymain_get_xoption (pymain , L"showrefcount" )) {
0 commit comments