mirror of
https://github.com/python/cpython.git
synced 2025-12-04 16:43:27 +00:00
Remove Lib/site.py hack to unregister patched builtins.
It creates a refleak in subinterpreters, as atexit callbacks aren't triggered at their end.
This commit is contained in:
parent
4ed328c4d7
commit
f93c7b8061
1 changed files with 10 additions and 29 deletions
39
Lib/site.py
39
Lib/site.py
|
|
@ -68,7 +68,6 @@ site-specific customizations. If this import fails with an
|
||||||
ImportError exception, it is silently ignored.
|
ImportError exception, it is silently ignored.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import atexit
|
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
|
|
@ -87,25 +86,6 @@ USER_SITE = None
|
||||||
USER_BASE = None
|
USER_BASE = None
|
||||||
|
|
||||||
|
|
||||||
_no_builtin = object()
|
|
||||||
|
|
||||||
def _patch_builtins(**items):
|
|
||||||
# When patching builtins, we make some objects almost immortal
|
|
||||||
# (builtins are only reclaimed at the very end of the interpreter
|
|
||||||
# shutdown sequence). To avoid keeping to many references alive,
|
|
||||||
# we register callbacks to undo our builtins additions.
|
|
||||||
old_items = {k: getattr(builtins, k, _no_builtin) for k in items}
|
|
||||||
def unpatch(old_items=old_items):
|
|
||||||
for k, v in old_items.items():
|
|
||||||
if v is _no_builtin:
|
|
||||||
delattr(builtins, k)
|
|
||||||
else:
|
|
||||||
setattr(builtins, k, v)
|
|
||||||
for k, v in items.items():
|
|
||||||
setattr(builtins, k, v)
|
|
||||||
atexit.register(unpatch)
|
|
||||||
|
|
||||||
|
|
||||||
def makepath(*paths):
|
def makepath(*paths):
|
||||||
dir = os.path.join(*paths)
|
dir = os.path.join(*paths)
|
||||||
try:
|
try:
|
||||||
|
|
@ -377,7 +357,8 @@ def setquit():
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
raise SystemExit(code)
|
raise SystemExit(code)
|
||||||
_patch_builtins(quit=Quitter('quit'), exit=Quitter('exit'))
|
builtins.quit = Quitter('quit')
|
||||||
|
builtins.exit = Quitter('exit')
|
||||||
|
|
||||||
|
|
||||||
class _Printer(object):
|
class _Printer(object):
|
||||||
|
|
@ -442,20 +423,20 @@ class _Printer(object):
|
||||||
|
|
||||||
def setcopyright():
|
def setcopyright():
|
||||||
"""Set 'copyright' and 'credits' in builtins"""
|
"""Set 'copyright' and 'credits' in builtins"""
|
||||||
_patch_builtins(copyright=_Printer("copyright", sys.copyright))
|
builtins.copyright = _Printer("copyright", sys.copyright)
|
||||||
if sys.platform[:4] == 'java':
|
if sys.platform[:4] == 'java':
|
||||||
_patch_builtins(credits=_Printer(
|
builtins.credits = _Printer(
|
||||||
"credits",
|
"credits",
|
||||||
"Jython is maintained by the Jython developers (www.jython.org)."))
|
"Jython is maintained by the Jython developers (www.jython.org).")
|
||||||
else:
|
else:
|
||||||
_patch_builtins(credits=_Printer("credits", """\
|
builtins.credits = _Printer("credits", """\
|
||||||
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
|
Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
|
||||||
for supporting Python development. See www.python.org for more information."""))
|
for supporting Python development. See www.python.org for more information.""")
|
||||||
here = os.path.dirname(os.__file__)
|
here = os.path.dirname(os.__file__)
|
||||||
_patch_builtins(license=_Printer(
|
builtins.license = _Printer(
|
||||||
"license", "See http://www.python.org/%.3s/license.html" % sys.version,
|
"license", "See http://www.python.org/%.3s/license.html" % sys.version,
|
||||||
["LICENSE.txt", "LICENSE"],
|
["LICENSE.txt", "LICENSE"],
|
||||||
[os.path.join(here, os.pardir), here, os.curdir]))
|
[os.path.join(here, os.pardir), here, os.curdir])
|
||||||
|
|
||||||
|
|
||||||
class _Helper(object):
|
class _Helper(object):
|
||||||
|
|
@ -472,7 +453,7 @@ class _Helper(object):
|
||||||
return pydoc.help(*args, **kwds)
|
return pydoc.help(*args, **kwds)
|
||||||
|
|
||||||
def sethelper():
|
def sethelper():
|
||||||
_patch_builtins(help=_Helper())
|
builtins.help = _Helper()
|
||||||
|
|
||||||
def enablerlcompleter():
|
def enablerlcompleter():
|
||||||
"""Enable default readline configuration on interactive prompts, by
|
"""Enable default readline configuration on interactive prompts, by
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue