[Python-checkins] bpo-34170: Add _PyCoreConfig._frozen parameter (GH-8591)

Victor Stinner webhook-mailer at python.org
Tue Jul 31 20:13:07 EDT 2018


https://github.com/python/cpython/commit/b75d7e243512afcfb2285e6471262478383e09db
commit: b75d7e243512afcfb2285e6471262478383e09db
branch: master
author: Victor Stinner <vstinner at redhat.com>
committer: GitHub <noreply at github.com>
date: 2018-08-01T02:13:04+02:00
summary:

bpo-34170: Add _PyCoreConfig._frozen parameter (GH-8591)

Modify frozenmain.c to use _Py_InitializeFromConfig().

files:
M Include/pystate.h
M Lib/test/test_embed.py
M Modules/getpath.c
M Modules/main.c
M Programs/_freeze_importlib.c
M Programs/_testembed.c
M Python/frozenmain.c

diff --git a/Include/pystate.h b/Include/pystate.h
index 612e7de99bef..bc1e23e39c72 100644
--- a/Include/pystate.h
+++ b/Include/pystate.h
@@ -235,6 +235,12 @@ typedef struct {
 
        See PEP 552 "Deterministic pycs" for more details. */
     const char *_check_hash_pycs_mode;
+
+    /* If greater than 0, suppress _PyPathConfig_Calculate() warnings.
+
+       If set to -1 (default), inherit Py_FrozenFlag value. */
+    int _frozen;
+
 } _PyCoreConfig;
 
 #ifdef MS_WINDOWS
@@ -269,7 +275,8 @@ typedef struct {
         .user_site_directory = -1, \
         .unbuffered_stdio = -1, \
         _PyCoreConfig_WINDOWS_INIT \
-        ._install_importlib = 1}
+        ._install_importlib = 1, \
+        ._frozen = -1}
 /* Note: _PyCoreConfig_INIT sets other fields to 0/NULL */
 
 /* Placeholders while working on the new configuration API
diff --git a/Lib/test/test_embed.py b/Lib/test/test_embed.py
index e00b1d8f481c..dd7d273629b4 100644
--- a/Lib/test/test_embed.py
+++ b/Lib/test/test_embed.py
@@ -289,6 +289,7 @@ class InitConfigTests(EmbeddingTestsMixin, unittest.TestCase):
 
         '_install_importlib': 1,
         '_check_hash_pycs_mode': 'default',
+        '_frozen': 0,
     }
 
     def check_config(self, testname, expected):
@@ -330,6 +331,7 @@ def test_init_global_config(self):
             'unbuffered_stdio': 1,
             'utf8_mode': 1,
             'user_site_directory': 0,
+            '_frozen': 1,
         }
         self.check_config("init_global_config", config)
 
@@ -362,7 +364,9 @@ def test_init_from_config(self):
             'unbuffered_stdio': 1,
             'user_site_directory': 0,
             'faulthandler': 1,
+
             '_check_hash_pycs_mode': 'always',
+            '_frozen': 1,
         }
         self.check_config("init_from_config", config)
 
diff --git a/Modules/getpath.c b/Modules/getpath.c
index 6d966e1bced4..041cb14b4b9c 100644
--- a/Modules/getpath.c
+++ b/Modules/getpath.c
@@ -372,7 +372,7 @@ calculate_prefix(const _PyCoreConfig *core_config,
 {
     calculate->prefix_found = search_for_prefix(core_config, calculate, prefix);
     if (!calculate->prefix_found) {
-        if (!Py_FrozenFlag) {
+        if (!core_config->_frozen) {
             fprintf(stderr,
                 "Could not find platform independent libraries <prefix>\n");
         }
@@ -495,7 +495,7 @@ calculate_exec_prefix(const _PyCoreConfig *core_config,
                                                           calculate,
                                                           exec_prefix);
     if (!calculate->exec_prefix_found) {
-        if (!Py_FrozenFlag) {
+        if (!core_config->_frozen) {
             fprintf(stderr,
                 "Could not find platform dependent libraries <exec_prefix>\n");
         }
@@ -915,7 +915,7 @@ calculate_path_impl(const _PyCoreConfig *core_config,
     calculate_exec_prefix(core_config, calculate, exec_prefix);
 
     if ((!calculate->prefix_found || !calculate->exec_prefix_found) &&
-        !Py_FrozenFlag)
+        !core_config->_frozen)
     {
         fprintf(stderr,
                 "Consider setting $PYTHONHOME to <prefix>[:<exec_prefix>]\n");
diff --git a/Modules/main.c b/Modules/main.c
index 8000a1aeb0b4..88e826283d80 100644
--- a/Modules/main.c
+++ b/Modules/main.c
@@ -573,6 +573,7 @@ _PyCoreConfig_GetGlobalConfig(_PyCoreConfig *config)
     COPY_FLAG(legacy_windows_fs_encoding, Py_LegacyWindowsFSEncodingFlag);
     COPY_FLAG(legacy_windows_stdio, Py_LegacyWindowsStdioFlag);
 #endif
+    COPY_FLAG(_frozen, Py_FrozenFlag);
 
     COPY_NOT_FLAG(use_environment, Py_IgnoreEnvironmentFlag);
     COPY_NOT_FLAG(site_import, Py_NoSiteFlag);
@@ -759,6 +760,7 @@ _PyCoreConfig_Copy(_PyCoreConfig *config, const _PyCoreConfig *config2)
     COPY_ATTR(legacy_windows_stdio);
 #endif
     COPY_ATTR(_check_hash_pycs_mode);
+    COPY_ATTR(_frozen);
 
 #undef COPY_ATTR
 #undef COPY_STR_ATTR
@@ -2281,6 +2283,9 @@ _PyCoreConfig_Read(_PyCoreConfig *config)
     if (config->utf8_mode < 0) {
         config->utf8_mode = 0;
     }
+    if (config->_frozen < 0) {
+        config->_frozen = 0;
+    }
 
     return _Py_INIT_OK();
 }
diff --git a/Programs/_freeze_importlib.c b/Programs/_freeze_importlib.c
index 05ae59c841e2..fdf5013e5473 100644
--- a/Programs/_freeze_importlib.c
+++ b/Programs/_freeze_importlib.c
@@ -82,8 +82,7 @@ main(int argc, char *argv[])
     /* Don't install importlib, since it could execute outdated bytecode. */
     config._install_importlib = 0;
     config.install_signal_handlers = 1;
-
-    Py_FrozenFlag++;
+    config._frozen = 1;
 
     _PyInitError err = _Py_InitializeFromConfig(&config);
     /* No need to call _PyCoreConfig_Clear() since we didn't allocate any
diff --git a/Programs/_testembed.c b/Programs/_testembed.c
index f7e774975f36..94db29b8d809 100644
--- a/Programs/_testembed.c
+++ b/Programs/_testembed.c
@@ -368,6 +368,7 @@ dump_config(void)
 
     printf("_install_importlib = %i\n", config->_install_importlib);
     printf("_check_hash_pycs_mode = %s\n", config->_check_hash_pycs_mode);
+    printf("_frozen = %i\n", config->_frozen);
 
 #undef ASSERT_EQUAL
 #undef ASSERT_STR_EQUAL
@@ -420,6 +421,8 @@ static int test_init_global_config(void)
     putenv("PYTHONUNBUFFERED=");
     Py_UnbufferedStdioFlag = 1;
 
+    Py_FrozenFlag = 1;
+
     /* FIXME: test Py_LegacyWindowsFSEncodingFlag */
     /* FIXME: test Py_LegacyWindowsStdioFlag */
 
@@ -525,6 +528,9 @@ static int test_init_from_config(void)
 
     config._check_hash_pycs_mode = "always";
 
+    Py_FrozenFlag = 0;
+    config._frozen = 1;
+
     _PyInitError err = _Py_InitializeFromConfig(&config);
     /* Don't call _PyCoreConfig_Clear() since all strings are static */
     if (_Py_INIT_FAILED(err)) {
diff --git a/Python/frozenmain.c b/Python/frozenmain.c
index a3b619671bdc..86af2b6f94c5 100644
--- a/Python/frozenmain.c
+++ b/Python/frozenmain.c
@@ -41,7 +41,8 @@ Py_FrozenMain(int argc, char **argv)
         }
     }
 
-    Py_FrozenFlag = 1; /* Suppress errors from getpath.c */
+    _PyCoreConfig config = _PyCoreConfig_INIT;
+    config._frozen = 1;   /* Suppress errors from getpath.c */
 
     if ((p = Py_GETENV("PYTHONINSPECT")) && *p != '\0')
         inspect = 1;
@@ -80,7 +81,14 @@ Py_FrozenMain(int argc, char **argv)
 #endif /* MS_WINDOWS */
     if (argc >= 1)
         Py_SetProgramName(argv_copy[0]);
-    Py_Initialize();
+
+    err = _Py_InitializeFromConfig(&config);
+    /* No need to call _PyCoreConfig_Clear() since we didn't allocate any
+       memory: program_name is a constant string. */
+    if (_Py_INIT_FAILED(err)) {
+        _Py_FatalInitError(err);
+    }
+
 #ifdef MS_WINDOWS
     PyWinFreeze_ExeInit();
 #endif



More information about the Python-checkins mailing list