diff -r e548ab4ce71d Lib/distutils/core.py --- a/Lib/distutils/core.py Mon Feb 09 19:49:00 2015 +0000 +++ b/Lib/distutils/core.py Mon Feb 09 19:14:15 2015 -0500 @@ -204,16 +204,15 @@ global _setup_stop_after, _setup_distribution _setup_stop_after = stop_after - save_argv = sys.argv + save_argv = sys.argv.copy() g = {'__file__': script_name} - l = {} try: try: sys.argv[0] = script_name if script_args is not None: sys.argv[1:] = script_args with open(script_name, 'rb') as f: - exec(f.read(), g, l) + exec(f.read(), g, g) finally: sys.argv = save_argv _setup_stop_after = None diff -r e548ab4ce71d Lib/distutils/tests/test_core.py --- a/Lib/distutils/tests/test_core.py Mon Feb 09 19:49:00 2015 +0000 +++ b/Lib/distutils/tests/test_core.py Mon Feb 09 19:14:15 2015 -0500 @@ -28,6 +28,21 @@ setup() """ +setup_does_nothing = """\ +from distutils.core import setup +setup() +""" + + +setup_defines_subclass = """\ +from distutils.core import setup +from distutils.command.install import install as _install + +class install(_install): + sub_commands = _install.sub_commands + ['cmd'] + +setup(cmdclass={'install': install}) +""" class CoreTestCase(support.EnvironGuard, unittest.TestCase): @@ -65,6 +80,21 @@ distutils.core.run_setup( self.write_setup(setup_using___file__)) + def test_run_setup_preserves_sys_argv(self): + # Make sure run_setup does not clobber sys.argv + argv_copy = sys.argv.copy() + distutils.core.run_setup( + self.write_setup(setup_does_nothing)) + self.assertEqual(sys.argv, argv_copy) + + def test_run_setup_defines_subclass(self): + # Make sure the script can use __file__; if that's missing, the test + # setup.py script will raise NameError. + dist = distutils.core.run_setup( + self.write_setup(setup_defines_subclass)) + install = dist.get_command_obj('install') + self.assertIn('cmd', install.sub_commands) + def test_run_setup_uses_current_dir(self): # This tests that the setup script is run with the current directory # as its own current directory; this was temporarily broken by a