Issue #7774: Set sys.executable to an empty string if argv[0] has been

set to an non existent program name and Python is unable to retrieve the real
program name.

Fix also sysconfig: if sys.executable is an empty string, use the current
working directory.
This commit is contained in:
Victor Stinner 2010-03-11 12:34:39 +00:00
parent 637637021a
commit 4a7e0c858c
4 changed files with 22 additions and 2 deletions

View file

@ -84,7 +84,12 @@ _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
_PROJECT_BASE = os.path.dirname(realpath(sys.executable)) if sys.executable:
_PROJECT_BASE = os.path.dirname(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())
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 = realpath(os.path.join(_PROJECT_BASE, pardir))

View file

@ -437,6 +437,17 @@ class SysModuleTest(unittest.TestCase):
self.assertEqual(sys.call_tracing(str, (2,)), "2") self.assertEqual(sys.call_tracing(str, (2,)), "2")
self.assertRaises(TypeError, sys.call_tracing, str, 2) self.assertRaises(TypeError, sys.call_tracing, str, 2)
def test_executable(self):
# Issue #7774: Ensure that sys.executable is an empty string if argv[0]
# has been set to an non existent program name and Python is unable to
# retrieve the real program name
import subprocess
p = subprocess.Popen(
["nonexistent", "-c", 'import sys; print "executable=%r" % sys.executable'],
executable=sys.executable, stdout=subprocess.PIPE)
executable = p.communicate()[0].strip()
p.wait()
self.assertEqual(executable, "executable=''")
class SizeofTest(unittest.TestCase): class SizeofTest(unittest.TestCase):

View file

@ -12,6 +12,10 @@ What's New in Python 2.7 beta 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #7774: Set sys.executable to an empty string if argv[0] has been
set to an non existent program name and Python is unable to retrieve the real
program name
- Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt - Issue #3137: Don't ignore errors at startup, especially a keyboard interrupt
(SIGINT). If an error occurs while importing the site module, the error is (SIGINT). If an error occurs while importing the site module, the error is
printed and Python exits. Initialize the GIL before importing the site printed and Python exits. Initialize the GIL before importing the site

View file

@ -441,7 +441,7 @@ calculate_path(void)
} }
else else
progpath[0] = '\0'; progpath[0] = '\0';
if (progpath[0] != SEP) if (progpath[0] != SEP && progpath[0] != '\0')
absolutize(progpath); absolutize(progpath);
strncpy(argv0_path, progpath, MAXPATHLEN); strncpy(argv0_path, progpath, MAXPATHLEN);
argv0_path[MAXPATHLEN] = '\0'; argv0_path[MAXPATHLEN] = '\0';