]> granicus.if.org Git - python/commitdiff
subprocess._optim_args_from_interpreter_flags()
authorVictor Stinner <victor.stinner@gmail.com>
Mon, 18 Jan 2016 11:15:08 +0000 (12:15 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Mon, 18 Jan 2016 11:15:08 +0000 (12:15 +0100)
Issue #26100:

* Add subprocess._optim_args_from_interpreter_flags()
* Add test.support.optim_args_from_interpreter_flags()
* Use new functions in distutils, test_cmd_line_script, test_compileall and
  test_inspect

The change enables test_details() test of test_inspect when -O or -OO command
line option is used.

Lib/distutils/util.py
Lib/subprocess.py
Lib/test/support/__init__.py
Lib/test/test_cmd_line_script.py
Lib/test/test_compileall.py
Lib/test/test_inspect.py

index e423325de4305553771d4cef0f4215c09f561ae5..fdcf6fabae2bc74a8d1e6b8504957187121237cd 100644 (file)
@@ -7,8 +7,8 @@ one of the other *util.py modules.
 import os
 import re
 import importlib.util
-import sys
 import string
+import sys
 from distutils.errors import DistutilsPlatformError
 from distutils.dep_util import newer
 from distutils.spawn import spawn
@@ -350,6 +350,11 @@ def byte_compile (py_files,
     generated in indirect mode; unless you know what you're doing, leave
     it set to None.
     """
+
+    # Late import to fix a bootstrap issue: _posixsubprocess is built by
+    # setup.py, but setup.py uses distutils.
+    import subprocess
+
     # nothing is done if sys.dont_write_bytecode is True
     if sys.dont_write_bytecode:
         raise DistutilsByteCompileError('byte-compiling is disabled.')
@@ -412,11 +417,9 @@ byte_compile(files, optimize=%r, force=%r,
 
             script.close()
 
-        cmd = [sys.executable, script_name]
-        if optimize == 1:
-            cmd.insert(1, "-O")
-        elif optimize == 2:
-            cmd.insert(1, "-OO")
+        cmd = [sys.executable]
+        cmd.extend(subprocess._optim_args_from_interpreter_flags())
+        cmd.append(script_name)
         spawn(cmd, dry_run=dry_run)
         execute(os.remove, (script_name,), "removing %s" % script_name,
                 dry_run=dry_run)
index d1324b8aedc37f33ebf1d0d336a0495f28f4ce5b..640519d8dbb29c8debdef08d762e5de6438113be 100644 (file)
@@ -520,6 +520,16 @@ DEVNULL = -3
 # but it's here so that it can be imported when Python is compiled without
 # threads.
 
+def _optim_args_from_interpreter_flags():
+    """Return a list of command-line arguments reproducing the current
+    optimization settings in sys.flags."""
+    args = []
+    value = sys.flags.optimize
+    if value > 0:
+        args.append('-' + 'O' * value)
+    return args
+
+
 def _args_from_interpreter_flags():
     """Return a list of command-line arguments reproducing the current
     settings in sys.flags and sys.warnoptions."""
@@ -527,7 +537,6 @@ def _args_from_interpreter_flags():
         'debug': 'd',
         # 'inspect': 'i',
         # 'interactive': 'i',
-        'optimize': 'O',
         'dont_write_bytecode': 'B',
         'no_user_site': 's',
         'no_site': 'S',
@@ -535,8 +544,9 @@ def _args_from_interpreter_flags():
         'verbose': 'v',
         'bytes_warning': 'b',
         'quiet': 'q',
+        # -O is handled in _optim_args_from_interpreter_flags()
     }
-    args = []
+    args = _optim_args_from_interpreter_flags()
     for flag, opt in flag_opt_map.items():
         v = getattr(sys.flags, flag)
         if v > 0:
index 2969b36acdf0116e718c624ea5664edc9b4aa741..58dcc8a7a71aadc8c9a3f9f2569e442d11efa789 100644 (file)
@@ -2053,6 +2053,11 @@ def args_from_interpreter_flags():
     settings in sys.flags and sys.warnoptions."""
     return subprocess._args_from_interpreter_flags()
 
+def optim_args_from_interpreter_flags():
+    """Return a list of command-line arguments reproducing the current
+    optimization settings in sys.flags."""
+    return subprocess._optim_args_from_interpreter_flags()
+
 #============================================================
 # Support for assertions about logging.
 #============================================================
index afac62aac5fbe6f730c3dddfcc86963e90deb940..9398040ee0168e858def537ea257acb04573cfe4 100644 (file)
@@ -138,9 +138,8 @@ class CmdLineTest(unittest.TestCase):
                             expected_argv0, expected_path0,
                             expected_package, expected_loader,
                             *cmd_line_switches):
-        if not __debug__:
-            cmd_line_switches += ('-' + 'O' * sys.flags.optimize,)
-        run_args = cmd_line_switches + (script_name,) + tuple(example_args)
+        run_args = [*support.optim_args_from_interpreter_flags(),
+                    *cmd_line_switches, script_name, *example_args]
         rc, out, err = assert_python_ok(*run_args, __isolated=False)
         self._check_output(script_name, rc, out + err, expected_file,
                            expected_argv0, expected_path0,
index 6d8a86352fc5e382b11c5cf1199f9b99e5ca1aef..9b424a7250617d78f8420035098d09ad8fe878b4 100644 (file)
@@ -231,10 +231,9 @@ class CommandLineTests(unittest.TestCase):
             raise unittest.SkipTest('not all entries on sys.path are writable')
 
     def _get_run_args(self, args):
-        interp_args = ['-S']
-        if sys.flags.optimize:
-            interp_args.append({1 : '-O', 2 : '-OO'}[sys.flags.optimize])
-        return interp_args + ['-m', 'compileall'] + list(args)
+        return [*support.optim_args_from_interpreter_flags(),
+                '-S', '-m', 'compileall',
+                *args]
 
     def assertRunOK(self, *args, **env_vars):
         rc, out, err = script_helper.assert_python_ok(
index 283c92268cbbe702a7cef580a94e6d63b05db7bb..422a3d60f2f9af421239ffe1d95cafce27848df0 100644 (file)
@@ -30,6 +30,7 @@ from test.support import MISSING_C_DOCSTRINGS, cpython_only
 from test.support.script_helper import assert_python_ok, assert_python_failure
 from test import inspect_fodder as mod
 from test import inspect_fodder2 as mod2
+from test import support
 
 from test.test_import import _ready_to_import
 
@@ -3536,14 +3537,14 @@ class TestMain(unittest.TestCase):
 
     def test_details(self):
         module = importlib.import_module('unittest')
-        rc, out, err = assert_python_ok('-m', 'inspect',
+        args = support.optim_args_from_interpreter_flags()
+        rc, out, err = assert_python_ok(*args, '-m', 'inspect',
                                         'unittest', '--details')
         output = out.decode()
         # Just a quick sanity check on the output
         self.assertIn(module.__name__, output)
         self.assertIn(module.__file__, output)
-        if not sys.flags.optimize:
-            self.assertIn(module.__cached__, output)
+        self.assertIn(module.__cached__, output)
         self.assertEqual(err, b'')