(original) (raw)
changeset: 99959:ac6d33317eda user: Victor Stinner victor.stinner@gmail.com date: Mon Jan 18 12:15:08 2016 +0100 files: 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 description: subprocess._optim_args_from_interpreter_flags() 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. diff -r c6a0f424837a -r ac6d33317eda Lib/distutils/util.py --- a/Lib/distutils/util.py Mon Jan 18 11:25:50 2016 +0100 +++ b/Lib/distutils/util.py Mon Jan 18 12:15:08 2016 +0100 @@ -7,8 +7,8 @@ import os import re import importlib.util +import string import sys -import string from distutils.errors import DistutilsPlatformError from distutils.dep_util import newer from distutils.spawn import spawn @@ -350,6 +350,11 @@ 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 @@ 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) diff -r c6a0f424837a -r ac6d33317eda Lib/subprocess.py --- a/Lib/subprocess.py Mon Jan 18 11:25:50 2016 +0100 +++ b/Lib/subprocess.py Mon Jan 18 12:15:08 2016 +0100 @@ -520,6 +520,16 @@ # 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 @@ 'debug': 'd', # 'inspect': 'i', # 'interactive': 'i', - 'optimize': 'O', 'dont_write_bytecode': 'B', 'no_user_site': 's', 'no_site': 'S', @@ -535,8 +544,9 @@ '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: diff -r c6a0f424837a -r ac6d33317eda Lib/test/support/__init__.py --- a/Lib/test/support/__init__.py Mon Jan 18 11:25:50 2016 +0100 +++ b/Lib/test/support/__init__.py Mon Jan 18 12:15:08 2016 +0100 @@ -2053,6 +2053,11 @@ 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. #============================================================ diff -r c6a0f424837a -r ac6d33317eda Lib/test/test_cmd_line_script.py --- a/Lib/test/test_cmd_line_script.py Mon Jan 18 11:25:50 2016 +0100 +++ b/Lib/test/test_cmd_line_script.py Mon Jan 18 12:15:08 2016 +0100 @@ -138,9 +138,8 @@ 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, diff -r c6a0f424837a -r ac6d33317eda Lib/test/test_compileall.py --- a/Lib/test/test_compileall.py Mon Jan 18 11:25:50 2016 +0100 +++ b/Lib/test/test_compileall.py Mon Jan 18 12:15:08 2016 +0100 @@ -231,10 +231,9 @@ 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( diff -r c6a0f424837a -r ac6d33317eda Lib/test/test_inspect.py --- a/Lib/test/test_inspect.py Mon Jan 18 11:25:50 2016 +0100 +++ b/Lib/test/test_inspect.py Mon Jan 18 12:15:08 2016 +0100 @@ -30,6 +30,7 @@ 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 @@ 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'') /victor.stinner@gmail.com