]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-39517: Allow runpy.run_path() to accept path-like objects (GH-18699)
authorMaor Kleinberger <kmaork@gmail.com>
Sun, 8 Mar 2020 20:43:17 +0000 (22:43 +0200)
committerGitHub <noreply@github.com>
Sun, 8 Mar 2020 20:43:17 +0000 (20:43 +0000)
Lib/runpy.py
Lib/test/test_runpy.py
Misc/NEWS.d/next/Library/2020-02-29-11-20-50.bpo-39517.voQZb8.rst [new file with mode: 0644]

index 8adc91e32f319e734bc419d2a9299f767c4b9730..0f54f3e71b6fe8ba9922e6d77dab607fd08073a1 100644 (file)
@@ -15,6 +15,7 @@ import importlib.machinery # importlib first so we can test #15386 via -m
 import importlib.util
 import io
 import types
+import os
 from pkgutil import read_code, get_importer
 
 __all__ = [
@@ -229,11 +230,12 @@ def _get_main_module_details(error=ImportError):
 
 def _get_code_from_file(run_name, fname):
     # Check for a compiled file first
-    with io.open_code(fname) as f:
+    decoded_path = os.path.abspath(os.fsdecode(fname))
+    with io.open_code(decoded_path) as f:
         code = read_code(f)
     if code is None:
         # That didn't work, so try it as normal source code
-        with io.open_code(fname) as f:
+        with io.open_code(decoded_path) as f:
             code = compile(f.read(), fname, 'exec')
     return code, fname
 
index f00308611163972598f27fd09535cdfef76d02de..84834d39b1c216e821bf54cf4d2c0e847489e6c9 100644 (file)
@@ -8,6 +8,7 @@ import tempfile
 import importlib, importlib.machinery, importlib.util
 import py_compile
 import warnings
+import pathlib
 from test.support import (
     forget, make_legacy_pyc, unload, verbose, no_tracing,
     create_empty_file, temp_dir)
@@ -652,6 +653,14 @@ class RunPathTestCase(unittest.TestCase, CodeExecutionMixin):
             self._check_script(script_name, "<run_path>", script_name,
                                script_name, expect_spec=False)
 
+    def test_basic_script_with_path_object(self):
+        with temp_dir() as script_dir:
+            mod_name = 'script'
+            script_name = pathlib.Path(self._make_test_script(script_dir,
+                                                              mod_name))
+            self._check_script(script_name, "<run_path>", script_name,
+                               script_name, expect_spec=False)
+
     def test_basic_script_no_suffix(self):
         with temp_dir() as script_dir:
             mod_name = 'script'
diff --git a/Misc/NEWS.d/next/Library/2020-02-29-11-20-50.bpo-39517.voQZb8.rst b/Misc/NEWS.d/next/Library/2020-02-29-11-20-50.bpo-39517.voQZb8.rst
new file mode 100644 (file)
index 0000000..0cd628f
--- /dev/null
@@ -0,0 +1 @@
+Fix runpy.run_path() when using pathlike objects
\ No newline at end of file