summaryrefslogtreecommitdiffstats
path: root/Lib/sysconfig.py
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@haypocalc.com>2010-10-12 22:23:23 (GMT)
committerVictor Stinner <victor.stinner@haypocalc.com>2010-10-12 22:23:23 (GMT)
commitb103a937eab54ed9a42fbc8c75d45246389d3002 (patch)
tree9147fa3b3bb7ed9c5aaa747707a36aca7832166b /Lib/sysconfig.py
parent6c314ec946b9e3075707557e74b91d33eed82e07 (diff)
downloadcpython-b103a937eab54ed9a42fbc8c75d45246389d3002.zip
cpython-b103a937eab54ed9a42fbc8c75d45246389d3002.tar.gz
cpython-b103a937eab54ed9a42fbc8c75d45246389d3002.tar.bz2
Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the
current directory was deleted.
Diffstat (limited to 'Lib/sysconfig.py')
-rw-r--r--Lib/sysconfig.py27
1 files changed, 19 insertions, 8 deletions
diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py
index 19847c9..f7c647c 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.