- Issue #2385: distutils.core.run_script() makes __file__ available, so the
controlled environment will more closely mirror the typical script
environment. This supports setup.py scripts that refer to data files.
diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py
index c40dd0a..640d6b5 100644
--- a/Lib/distutils/core.py
+++ b/Lib/distutils/core.py
@@ -210,8 +210,9 @@
_setup_stop_after = stop_after
save_argv = sys.argv
- g = {}
+ g = {'__file__': script_name}
l = {}
+ os.chdir(os.path.dirname(script_name) or os.curdir)
try:
try:
sys.argv[0] = script_name
diff --git a/Lib/distutils/tests/test_core.py b/Lib/distutils/tests/test_core.py
new file mode 100644
index 0000000..6de58d9
--- /dev/null
+++ b/Lib/distutils/tests/test_core.py
@@ -0,0 +1,40 @@
+"""Tests for distutils.core."""
+
+import StringIO
+import distutils.core
+import os
+import test.test_support
+import unittest
+
+
+# setup script that uses __file__
+setup_using___file__ = """\
+
+__file__
+
+from distutils.core import setup
+setup()
+"""
+
+
+class CoreTestCase(unittest.TestCase):
+
+ def tearDown(self):
+ os.remove(test.test_support.TESTFN)
+
+ def write_setup(self, text):
+ return fn
+
+ def test_run_setup_provides_file(self):
+ # Make sure the script can use __file__; if that's missing, the test
+ # setup.py script will raise NameError.
+ fn = test.test_support.TESTFN
+ open(fn, "w").write(setup_using___file__)
+ distutils.core.run_setup(fn)
+
+
+def test_suite():
+ return unittest.makeSuite(CoreTestCase)
+
+if __name__ == "__main__":
+ unittest.main(defaultTest="test_suite")
diff --git a/Misc/NEWS b/Misc/NEWS
index 8742cb4..c07f546 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -18,6 +18,10 @@
Library
-------
+- Issue #2385: distutils.core.run_script() makes __file__ available, so the
+ controlled environment will more closely mirror the typical script
+ environment. This supports setup.py scripts that refer to data files.
+
Tests
-----