mirror of
https://github.com/python/cpython.git
synced 2025-09-02 23:18:25 +00:00
Issue #6612: Fix site and sysconfig to catch os.getcwd() error, eg. if the
current directory was deleted.
This commit is contained in:
parent
6c314ec946
commit
b103a937ea
3 changed files with 29 additions and 11 deletions
10
Lib/site.py
10
Lib/site.py
|
@ -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():
|
||||||
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)
|
||||||
_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):
|
||||||
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):
|
||||||
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):
|
||||||
# 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?
|
||||||
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
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue