mirror of https://github.com/python/cpython
Issue #19209: Remove import of copyreg from the os module to speed up
interpreter startup. stat_result and statvfs_result are now hard-coded to reside in the os module. The patch is based on Victor Stinner's patch.
This commit is contained in:
parent
1a5fb4e3c1
commit
2582762b1b
27
Lib/os.py
27
Lib/os.py
|
@ -945,33 +945,6 @@ otherwise return -SIG, where SIG is the signal that killed it. """
|
|||
__all__.extend(["spawnlp", "spawnlpe"])
|
||||
|
||||
|
||||
import copyreg as _copyreg
|
||||
|
||||
def _make_stat_result(tup, dict):
|
||||
return stat_result(tup, dict)
|
||||
|
||||
def _pickle_stat_result(sr):
|
||||
(type, args) = sr.__reduce__()
|
||||
return (_make_stat_result, args)
|
||||
|
||||
try:
|
||||
_copyreg.pickle(stat_result, _pickle_stat_result, _make_stat_result)
|
||||
except NameError: # stat_result may not exist
|
||||
pass
|
||||
|
||||
def _make_statvfs_result(tup, dict):
|
||||
return statvfs_result(tup, dict)
|
||||
|
||||
def _pickle_statvfs_result(sr):
|
||||
(type, args) = sr.__reduce__()
|
||||
return (_make_statvfs_result, args)
|
||||
|
||||
try:
|
||||
_copyreg.pickle(statvfs_result, _pickle_statvfs_result,
|
||||
_make_statvfs_result)
|
||||
except NameError: # statvfs_result may not exist
|
||||
pass
|
||||
|
||||
# Supply os.popen()
|
||||
def popen(cmd, mode="r", buffering=-1):
|
||||
if not isinstance(cmd, str):
|
||||
|
|
|
@ -26,6 +26,7 @@ import locale
|
|||
import codecs
|
||||
import decimal
|
||||
import fractions
|
||||
import pickle
|
||||
try:
|
||||
import threading
|
||||
except ImportError:
|
||||
|
@ -264,6 +265,13 @@ class StatAttributeTests(unittest.TestCase):
|
|||
warnings.simplefilter("ignore", DeprecationWarning)
|
||||
self.check_stat_attributes(fname)
|
||||
|
||||
def test_stat_result_pickle(self):
|
||||
result = os.stat(self.fname)
|
||||
p = pickle.dumps(result)
|
||||
self.assertIn(b'\x03cos\nstat_result\n', p)
|
||||
unpickled = pickle.loads(p)
|
||||
self.assertEqual(result, unpickled)
|
||||
|
||||
def test_statvfs_attributes(self):
|
||||
if not hasattr(os, "statvfs"):
|
||||
return
|
||||
|
@ -310,6 +318,20 @@ class StatAttributeTests(unittest.TestCase):
|
|||
except TypeError:
|
||||
pass
|
||||
|
||||
@unittest.skipUnless(hasattr(os, 'statvfs'),
|
||||
"need os.statvfs()")
|
||||
def test_statvfs_result_pickle(self):
|
||||
try:
|
||||
result = os.statvfs(self.fname)
|
||||
except OSError as e:
|
||||
# On AtheOS, glibc always returns ENOSYS
|
||||
if e.errno == errno.ENOSYS:
|
||||
return
|
||||
p = pickle.dumps(result)
|
||||
self.assertIn(b'\x03cos\nstatvfs_result\n', p)
|
||||
unpickled = pickle.loads(p)
|
||||
self.assertEqual(result, unpickled)
|
||||
|
||||
def test_utime_dir(self):
|
||||
delta = 1000000
|
||||
st = os.stat(support.TESTFN)
|
||||
|
|
|
@ -431,10 +431,13 @@ class StartupImportTests(unittest.TestCase):
|
|||
modules = eval(stdout.decode('utf-8'))
|
||||
self.assertIn('site', modules)
|
||||
|
||||
# http://bugs.python.org/issue19205
|
||||
re_mods = {'re', '_sre', 'sre_compile', 'sre_constants', 'sre_parse'}
|
||||
self.assertFalse(modules.intersection(re_mods))
|
||||
|
||||
# http://bugs.python.org/issue9548
|
||||
self.assertNotIn('locale', modules)
|
||||
# http://bugs.python.org/issue19209
|
||||
self.assertNotIn('copyreg', modules)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
|
|
@ -36,6 +36,10 @@ Core and Builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- Issue #19209: Remove import of copyreg from the os module to speed up
|
||||
interpreter startup. stat_result and statvfs_result are now hard-coded to
|
||||
reside in the os module.
|
||||
|
||||
- Issue #19205: Don't import the 're' module in site and sysconfig module to
|
||||
to speed up interpreter start.
|
||||
|
||||
|
|
|
@ -11974,7 +11974,7 @@ INITFUNC(void)
|
|||
return NULL;
|
||||
#endif
|
||||
|
||||
stat_result_desc.name = MODNAME ".stat_result";
|
||||
stat_result_desc.name = "os.stat_result"; /* see issue #19209 */
|
||||
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
|
||||
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
|
||||
stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
|
||||
|
@ -11983,7 +11983,7 @@ INITFUNC(void)
|
|||
structseq_new = StatResultType.tp_new;
|
||||
StatResultType.tp_new = statresult_new;
|
||||
|
||||
statvfs_result_desc.name = MODNAME ".statvfs_result";
|
||||
statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */
|
||||
if (PyStructSequence_InitType2(&StatVFSResultType,
|
||||
&statvfs_result_desc) < 0)
|
||||
return NULL;
|
||||
|
|
Loading…
Reference in New Issue