Merged revisions 78868-78869 via svnmerge from

svn+ssh://pythondev@svn.python.org/python/branches/py3k

................
  r78868 | victor.stinner | 2010-03-12 15:20:59 +0100 (ven., 12 mars 2010) | 25 lines

  Merged revisions 78835-78837 via svnmerge from
  svn+ssh://pythondev@svn.python.org/python/trunk

  ........
    r78835 | victor.stinner | 2010-03-11 13:34:39 +0100 (jeu., 11 mars 2010) | 7 lines

    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.
  ........
    r78836 | victor.stinner | 2010-03-11 14:27:35 +0100 (jeu., 11 mars 2010) | 4 lines

    Fix test_executable introduce in previous commit (r78835): Windows is able to
    retrieve the absolute Python path even if argv[0] has been set to a non
    existent program name.
  ........
    r78837 | victor.stinner | 2010-03-11 14:46:06 +0100 (jeu., 11 mars 2010) | 3 lines

    Another fix to test_executable() of test_sys: set the current working to avoid
    the #7774 bug.
  ........
................
  r78869 | victor.stinner | 2010-03-12 15:27:16 +0100 (ven., 12 mars 2010) | 2 lines

  Oops, I loose the NEWS change in my previous backport (r78868) of r78835.
................
This commit is contained in:
Victor Stinner 2010-03-21 20:41:54 +00:00
parent 09e4697ad1
commit 19495a7adc
3 changed files with 22 additions and 1 deletions

View file

@ -438,6 +438,23 @@ class SysModuleTest(unittest.TestCase):
out = p.stdout.read().strip() out = p.stdout.read().strip()
self.assertEqual(out, b'?') self.assertEqual(out, b'?')
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
# For a normal installation, it should work without 'cwd'
# argument. For test runs in the build directory, see #7774.
python_dir = os.path.dirname(os.path.realpath(sys.executable))
p = subprocess.Popen(
["nonexistent", "-c",
'import sys; print(sys.executable.encode("ascii", "backslashreplace"))'],
executable=sys.executable, stdout=subprocess.PIPE, cwd=python_dir)
stdout = p.communicate()[0]
executable = stdout.strip().decode("ASCII")
p.wait()
self.assertIn(executable, ["b''", repr(sys.executable.encode("ascii", "backslashreplace"))])
class SizeofTest(unittest.TestCase): class SizeofTest(unittest.TestCase):

View file

@ -135,6 +135,10 @@ Core and Builtins
Library Library
------- -------
- 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 #6509: fix re.sub to work properly when the pattern, the string, and - Issue #6509: fix re.sub to work properly when the pattern, the string, and
the replacement were all bytes. Patch by Antoine Pitrou. the replacement were all bytes. Patch by Antoine Pitrou.

View file

@ -522,7 +522,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);
wcsncpy(argv0_path, progpath, MAXPATHLEN); wcsncpy(argv0_path, progpath, MAXPATHLEN);
argv0_path[MAXPATHLEN] = '\0'; argv0_path[MAXPATHLEN] = '\0';