Merge from 3.6

This commit is contained in:
Steve Dower 2016-10-29 08:50:42 -07:00
commit 842a146672
2 changed files with 51 additions and 25 deletions

View File

@ -14,6 +14,7 @@ import re
import encodings import encodings
import urllib.request import urllib.request
import urllib.error import urllib.error
import shutil
import subprocess import subprocess
import sysconfig import sysconfig
from copy import copy from copy import copy
@ -488,22 +489,44 @@ class StartupImportTests(unittest.TestCase):
'import site, sys; site.enablerlcompleter(); sys.exit(hasattr(sys, "__interactivehook__"))']).wait() 'import site, sys; site.enablerlcompleter(); sys.exit(hasattr(sys, "__interactivehook__"))']).wait()
self.assertTrue(r, "'__interactivehook__' not added by enablerlcompleter()") self.assertTrue(r, "'__interactivehook__' not added by enablerlcompleter()")
@classmethod
def _create_underpth_exe(self, lines):
exe_file = os.path.join(os.getenv('TEMP'), os.path.split(sys.executable)[1])
shutil.copy(sys.executable, exe_file)
_pth_file = os.path.splitext(exe_file)[0] + '._pth'
try:
with open(_pth_file, 'w') as f:
for line in lines:
print(line, file=f)
return exe_file
except:
os.unlink(_pth_file)
os.unlink(exe_file)
raise
@classmethod
def _cleanup_underpth_exe(self, exe_file):
_pth_file = os.path.splitext(exe_file)[0] + '._pth'
os.unlink(_pth_file)
os.unlink(exe_file)
@unittest.skipUnless(sys.platform == 'win32', "only supported on Windows") @unittest.skipUnless(sys.platform == 'win32', "only supported on Windows")
def test_underpth_nosite_file(self): def test_underpth_nosite_file(self):
_pth_file = os.path.splitext(sys.executable)[0] + '._pth' libpath = os.path.dirname(os.path.dirname(encodings.__file__))
try: exe_prefix = os.path.dirname(sys.executable)
libpath = os.path.dirname(os.path.dirname(encodings.__file__)) exe_file = self._create_underpth_exe([
with open(_pth_file, 'w') as f: 'fake-path-name',
print('fake-path-name', file=f) *[libpath for _ in range(200)],
# Ensure the generated path is very long so that buffer '# comment',
# resizing in getpathp.c is exercised 'import site'
for _ in range(200): ])
print(libpath, file=f)
print('# comment', file=f)
try:
env = os.environ.copy() env = os.environ.copy()
env['PYTHONPATH'] = 'from-env' env['PYTHONPATH'] = 'from-env'
rc = subprocess.call([sys.executable, '-c', env['PATH'] = '{};{}'.format(exe_prefix, os.getenv('PATH'))
rc = subprocess.call([exe_file, '-c',
'import sys; sys.exit(sys.flags.no_site and ' 'import sys; sys.exit(sys.flags.no_site and '
'len(sys.path) > 200 and ' 'len(sys.path) > 200 and '
'%r in sys.path and %r in sys.path and %r not in sys.path)' % ( '%r in sys.path and %r in sys.path and %r not in sys.path)' % (
@ -511,34 +534,34 @@ class StartupImportTests(unittest.TestCase):
libpath, libpath,
os.path.join(sys.prefix, 'from-env'), os.path.join(sys.prefix, 'from-env'),
)], env=env) )], env=env)
self.assertEqual(rc, 0)
finally: finally:
os.unlink(_pth_file) self._cleanup_underpth_exe(exe_file)
self.assertEqual(rc, 0)
@unittest.skipUnless(sys.platform == 'win32', "only supported on Windows") @unittest.skipUnless(sys.platform == 'win32', "only supported on Windows")
def test_underpth_file(self): def test_underpth_file(self):
_pth_file = os.path.splitext(sys.executable)[0] + '._pth' libpath = os.path.dirname(os.path.dirname(encodings.__file__))
exe_prefix = os.path.dirname(sys.executable)
exe_file = self._create_underpth_exe([
'fake-path-name',
*[libpath for _ in range(200)],
'# comment',
'import site'
])
try: try:
libpath = os.path.dirname(os.path.dirname(encodings.__file__))
with open(_pth_file, 'w') as f:
print('fake-path-name', file=f)
for _ in range(200):
print(libpath, file=f)
print('# comment', file=f)
print('import site', file=f)
env = os.environ.copy() env = os.environ.copy()
env['PYTHONPATH'] = 'from-env' env['PYTHONPATH'] = 'from-env'
rc = subprocess.call([sys.executable, '-c', env['PATH'] = '{};{}'.format(exe_prefix, os.getenv('PATH'))
rc = subprocess.call([exe_file, '-c',
'import sys; sys.exit(not sys.flags.no_site and ' 'import sys; sys.exit(not sys.flags.no_site and '
'%r in sys.path and %r in sys.path and %r not in sys.path)' % ( '%r in sys.path and %r in sys.path and %r not in sys.path)' % (
os.path.join(sys.prefix, 'fake-path-name'), os.path.join(sys.prefix, 'fake-path-name'),
libpath, libpath,
os.path.join(sys.prefix, 'from-env'), os.path.join(sys.prefix, 'from-env'),
)], env=env) )], env=env)
self.assertEqual(rc, 0)
finally: finally:
os.unlink(_pth_file) self._cleanup_underpth_exe(exe_file)
self.assertEqual(rc, 0)
if __name__ == "__main__": if __name__ == "__main__":

View File

@ -48,6 +48,9 @@ if defined qmode goto Qmode
echo Deleting .pyc/.pyo files ... echo Deleting .pyc/.pyo files ...
"%exe%" "%pcbuild%rmpyc.py" "%exe%" "%pcbuild%rmpyc.py"
echo Cleaning _pth files ...
if exist %prefix%*._pth del %prefix%*._pth
echo on echo on
%cmd% %cmd%
@echo off @echo off