From 94a3facc0e5ce02ef34d9fa595703cd96cb95984 Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Sun, 7 Jan 2018 08:35:28 -0800 Subject: [PATCH] bpo-31802: Fix importing native path module before importing os. (GH-4017) (#5129) (cherry picked from commit 3460198f6ba40a839f105c381f07179aba1e8c61) --- Lib/macpath.py | 23 ++++++++++--------- Lib/ntpath.py | 23 ++++++++++--------- Lib/posixpath.py | 22 ++++++++++-------- Lib/test/test_genericpath.py | 4 ++++ .../2017-10-17-14-52-14.bpo-31802.sYj2Zv.rst | 2 ++ 5 files changed, 42 insertions(+), 32 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2017-10-17-14-52-14.bpo-31802.sYj2Zv.rst diff --git a/Lib/macpath.py b/Lib/macpath.py index a90d1053bc..d15b7e1e9e 100644 --- a/Lib/macpath.py +++ b/Lib/macpath.py @@ -1,5 +1,17 @@ """Pathname and path-related operations for the Macintosh.""" +# strings representing various path-related bits and pieces +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = ':' +pardir = '::' +extsep = '.' +sep = ':' +pathsep = '\n' +defpath = ':' +altsep = None +devnull = 'Dev:Null' + import os from stat import * import genericpath @@ -12,17 +24,6 @@ __all__ = ["normcase","isabs","join","splitdrive","split","splitext", "curdir","pardir","sep","pathsep","defpath","altsep","extsep", "devnull","realpath","supports_unicode_filenames"] -# strings representing various path-related bits and pieces -# These are primarily for export; internally, they are hardcoded. -curdir = ':' -pardir = '::' -extsep = '.' -sep = ':' -pathsep = '\n' -defpath = ':' -altsep = None -devnull = 'Dev:Null' - def _get_colon(path): if isinstance(path, bytes): return b':' diff --git a/Lib/ntpath.py b/Lib/ntpath.py index a8f4b37f64..a5e79ba663 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -5,6 +5,18 @@ Instead of importing this module directly, import os and refer to this module as os.path. """ +# strings representing various path-related bits and pieces +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '\\' +pathsep = ';' +altsep = '/' +defpath = '.;C:\\bin' +devnull = 'nul' + import os import sys import stat @@ -19,17 +31,6 @@ __all__ = ["normcase","isabs","join","splitdrive","split","splitext", "extsep","devnull","realpath","supports_unicode_filenames","relpath", "samefile", "sameopenfile", "samestat", "commonpath"] -# strings representing various path-related bits and pieces -# These are primarily for export; internally, they are hardcoded. -curdir = '.' -pardir = '..' -extsep = '.' -sep = '\\' -pathsep = ';' -altsep = '/' -defpath = '.;C:\\bin' -devnull = 'nul' - def _get_bothseps(path): if isinstance(path, bytes): return b'\\/' diff --git a/Lib/posixpath.py b/Lib/posixpath.py index 6dbdab2749..e92186c64e 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -10,6 +10,18 @@ Some of this can actually be useful on non-Posix systems too, e.g. for manipulation of the pathname component of URLs. """ +# Strings representing various path-related bits and pieces. +# These are primarily for export; internally, they are hardcoded. +# Should be set before imports for resolving cyclic dependency. +curdir = '.' +pardir = '..' +extsep = '.' +sep = '/' +pathsep = ':' +defpath = ':/bin:/usr/bin' +altsep = None +devnull = '/dev/null' + import os import sys import stat @@ -25,16 +37,6 @@ __all__ = ["normcase","isabs","join","splitdrive","split","splitext", "devnull","realpath","supports_unicode_filenames","relpath", "commonpath"] -# Strings representing various path-related bits and pieces. -# These are primarily for export; internally, they are hardcoded. -curdir = '.' -pardir = '..' -extsep = '.' -sep = '/' -pathsep = ':' -defpath = ':/bin:/usr/bin' -altsep = None -devnull = '/dev/null' def _get_sep(path): if isinstance(path, bytes): diff --git a/Lib/test/test_genericpath.py b/Lib/test/test_genericpath.py index 01e11da098..ad5a59c44e 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -8,6 +8,7 @@ import sys import unittest import warnings from test import support +from test.support.script_helper import assert_python_ok def create_file(filename, data=b'foo'): @@ -486,6 +487,9 @@ class CommonTest(GenericTest): with self.assertRaisesRegex(TypeError, 'bytearray'): self.pathmodule.relpath(bytearray(b'foo'), bytearray(b'bar')) + def test_import(self): + assert_python_ok('-S', '-c', 'import ' + self.pathmodule.__name__) + class PathLikeTests(unittest.TestCase): diff --git a/Misc/NEWS.d/next/Library/2017-10-17-14-52-14.bpo-31802.sYj2Zv.rst b/Misc/NEWS.d/next/Library/2017-10-17-14-52-14.bpo-31802.sYj2Zv.rst new file mode 100644 index 0000000000..77df6bbe69 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2017-10-17-14-52-14.bpo-31802.sYj2Zv.rst @@ -0,0 +1,2 @@ +Importing native path module (``posixpath``, ``ntpath``) now works even if +the ``os`` module still is not imported. -- 2.40.0