From b2f76911d40d46626a365fa3b59f66361c63d792 Mon Sep 17 00:00:00 2001 From: Serhiy Storchaka Date: Sun, 7 Jan 2018 17:54:31 +0200 Subject: [PATCH] bpo-31802: Fix importing native path module before importing os. (GH-4017) (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 a90d1053bc83d0..d15b7e1e9e26b8 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 @@ "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 a8f4b37f6487e2..a5e79ba66371f8 100644 --- a/Lib/ntpath.py +++ b/Lib/ntpath.py @@ -5,6 +5,18 @@ 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 @@ "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 6dbdab27497f2b..e92186c64e0ddb 100644 --- a/Lib/posixpath.py +++ b/Lib/posixpath.py @@ -10,6 +10,18 @@ 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 @@ "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 01e11da09805e7..ad5a59c44ed7bd 100644 --- a/Lib/test/test_genericpath.py +++ b/Lib/test/test_genericpath.py @@ -8,6 +8,7 @@ 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 @@ def test_relpath_errors(self): 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 00000000000000..77df6bbe6950e6 --- /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.