From b103a937eab54ed9a42fbc8c75d45246389d3002 Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Tue, 12 Oct 2010 22:23:23 +0000 Subject: [PATCH] Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the current directory was deleted. --- Lib/site.py | 10 +++++++--- Lib/sysconfig.py | 27 +++++++++++++++++++-------- Misc/NEWS | 3 +++ 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Lib/site.py b/Lib/site.py index 51516aa914e..9d1084a4a2e 100644 --- a/Lib/site.py +++ b/Lib/site.py @@ -70,7 +70,11 @@ USER_BASE = None def makepath(*paths): - dir = os.path.abspath(os.path.join(*paths)) + dir = os.path.join(*paths) + try: + dir = os.path.abspath(dir) + except OSError: + pass return dir, os.path.normcase(dir) @@ -81,11 +85,11 @@ def abs_paths(): continue # don't mess with a PEP 302-supplied __file__ try: m.__file__ = os.path.abspath(m.__file__) - except AttributeError: + except (AttributeError, OSError): pass try: m.__cached__ = os.path.abspath(m.__cached__) - except AttributeError: + except (AttributeError, OSError): pass diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 19847c9dfc1..f7c647c1489 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -107,21 +107,28 @@ _PREFIX = os.path.normpath(sys.prefix) _EXEC_PREFIX = os.path.normpath(sys.exec_prefix) _CONFIG_VARS = None _USER_BASE = None + +def _safe_realpath(path): + try: + return realpath(path) + except OSError: + return path + if sys.executable: - _PROJECT_BASE = os.path.dirname(realpath(sys.executable)) + _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable)) else: # sys.executable can be empty if argv[0] has been changed and Python is # unable to retrieve the real program name - _PROJECT_BASE = realpath(os.getcwd()) + _PROJECT_BASE = _safe_realpath(os.getcwd()) if os.name == "nt" and "pcbuild" in _PROJECT_BASE[-8:].lower(): - _PROJECT_BASE = realpath(os.path.join(_PROJECT_BASE, pardir)) + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir)) # PC/VS7.1 if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): - _PROJECT_BASE = realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) # PC/AMD64 if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): - _PROJECT_BASE = realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) + _PROJECT_BASE = _safe_realpath(os.path.join(_PROJECT_BASE, pardir, pardir)) def is_python_build(): for fn in ("Setup.dist", "Setup.local"): @@ -362,7 +369,7 @@ def _init_non_posix(vars): vars['SO'] = '.pyd' vars['EXE'] = '.exe' vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT - vars['BINDIR'] = os.path.dirname(realpath(sys.executable)) + vars['BINDIR'] = os.path.dirname(_safe_realpath(sys.executable)) # # public APIs @@ -475,7 +482,7 @@ def get_config_vars(*args): if 'srcdir' not in _CONFIG_VARS: _CONFIG_VARS['srcdir'] = _PROJECT_BASE else: - _CONFIG_VARS['srcdir'] = realpath(_CONFIG_VARS['srcdir']) + _CONFIG_VARS['srcdir'] = _safe_realpath(_CONFIG_VARS['srcdir']) # Convert srcdir into an absolute path if it appears necessary. @@ -484,8 +491,12 @@ def get_config_vars(*args): # from a different directory. if _PYTHON_BUILD and os.name == "posix": base = _PROJECT_BASE + try: + cwd = os.getcwd() + except OSError: + cwd = None if (not os.path.isabs(_CONFIG_VARS['srcdir']) and - base != os.getcwd()): + base != cwd): # srcdir is relative and we are not in the same directory # as the executable. Assume executable is in the build # directory and make srcdir absolute. diff --git a/Misc/NEWS b/Misc/NEWS index 44b7b46777f..aed06d05ccb 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -10,6 +10,9 @@ What's New in Python 3.2 Beta 1? Core and Builtins ----------------- +- Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the + current directory was deleted. + Library -------