Kaydet (Commit) b103a937 authored tarafından Victor Stinner's avatar Victor Stinner

Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the

current directory was deleted.
üst 6c314ec9
...@@ -70,7 +70,11 @@ USER_BASE = None ...@@ -70,7 +70,11 @@ USER_BASE = None
def makepath(*paths): 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) return dir, os.path.normcase(dir)
...@@ -81,11 +85,11 @@ def abs_paths(): ...@@ -81,11 +85,11 @@ def abs_paths():
continue # don't mess with a PEP 302-supplied __file__ continue # don't mess with a PEP 302-supplied __file__
try: try:
m.__file__ = os.path.abspath(m.__file__) m.__file__ = os.path.abspath(m.__file__)
except AttributeError: except (AttributeError, OSError):
pass pass
try: try:
m.__cached__ = os.path.abspath(m.__cached__) m.__cached__ = os.path.abspath(m.__cached__)
except AttributeError: except (AttributeError, OSError):
pass pass
......
...@@ -107,21 +107,28 @@ _PREFIX = os.path.normpath(sys.prefix) ...@@ -107,21 +107,28 @@ _PREFIX = os.path.normpath(sys.prefix)
_EXEC_PREFIX = os.path.normpath(sys.exec_prefix) _EXEC_PREFIX = os.path.normpath(sys.exec_prefix)
_CONFIG_VARS = None _CONFIG_VARS = None
_USER_BASE = None _USER_BASE = None
def _safe_realpath(path):
try:
return realpath(path)
except OSError:
return path
if sys.executable: if sys.executable:
_PROJECT_BASE = os.path.dirname(realpath(sys.executable)) _PROJECT_BASE = os.path.dirname(_safe_realpath(sys.executable))
else: else:
# sys.executable can be empty if argv[0] has been changed and Python is # sys.executable can be empty if argv[0] has been changed and Python is
# unable to retrieve the real program name # 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(): 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 # PC/VS7.1
if os.name == "nt" and "\\pc\\v" in _PROJECT_BASE[-10:].lower(): 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 # PC/AMD64
if os.name == "nt" and "\\pcbuild\\amd64" in _PROJECT_BASE[-14:].lower(): 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(): def is_python_build():
for fn in ("Setup.dist", "Setup.local"): for fn in ("Setup.dist", "Setup.local"):
...@@ -362,7 +369,7 @@ def _init_non_posix(vars): ...@@ -362,7 +369,7 @@ def _init_non_posix(vars):
vars['SO'] = '.pyd' vars['SO'] = '.pyd'
vars['EXE'] = '.exe' vars['EXE'] = '.exe'
vars['VERSION'] = _PY_VERSION_SHORT_NO_DOT 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 # public APIs
...@@ -475,7 +482,7 @@ def get_config_vars(*args): ...@@ -475,7 +482,7 @@ def get_config_vars(*args):
if 'srcdir' not in _CONFIG_VARS: if 'srcdir' not in _CONFIG_VARS:
_CONFIG_VARS['srcdir'] = _PROJECT_BASE _CONFIG_VARS['srcdir'] = _PROJECT_BASE
else: 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. # Convert srcdir into an absolute path if it appears necessary.
...@@ -484,8 +491,12 @@ def get_config_vars(*args): ...@@ -484,8 +491,12 @@ def get_config_vars(*args):
# from a different directory. # from a different directory.
if _PYTHON_BUILD and os.name == "posix": if _PYTHON_BUILD and os.name == "posix":
base = _PROJECT_BASE base = _PROJECT_BASE
try:
cwd = os.getcwd()
except OSError:
cwd = None
if (not os.path.isabs(_CONFIG_VARS['srcdir']) and 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 # srcdir is relative and we are not in the same directory
# as the executable. Assume executable is in the build # as the executable. Assume executable is in the build
# directory and make srcdir absolute. # directory and make srcdir absolute.
......
...@@ -10,6 +10,9 @@ What's New in Python 3.2 Beta 1? ...@@ -10,6 +10,9 @@ What's New in Python 3.2 Beta 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the
current directory was deleted.
Library Library
------- -------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment