summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Doc/c-api/buffer.rst2
-rw-r--r--Doc/c-api/sequence.rst10
-rw-r--r--Doc/conf.py3
-rw-r--r--Doc/library/ctypes.rst3
-rw-r--r--Doc/library/email-examples.rst2
-rw-r--r--Doc/library/exceptions.rst6
-rw-r--r--Doc/library/functions.rst4
-rw-r--r--Doc/library/http.client.rst2
-rw-r--r--Doc/library/os.rst31
-rw-r--r--Doc/library/rlcompleter.rst2
-rw-r--r--Doc/library/smtplib.rst5
-rw-r--r--Doc/library/subprocess.rst9
-rw-r--r--Doc/reference/simple_stmts.rst8
-rw-r--r--Lib/gettext.py4
-rw-r--r--Lib/idlelib/macosxSupport.py1
-rw-r--r--Lib/logging/__init__.py8
-rw-r--r--Lib/test/support.py11
-rw-r--r--Lib/test/test_hashlib.py3
-rw-r--r--Lib/test/test_os.py4
-rw-r--r--Lib/test/test_unittest.py2
-rw-r--r--Lib/unittest.py63
-rw-r--r--Lib/zipfile.py48
-rw-r--r--Tools/freeze/makeconfig.py2
23 files changed, 132 insertions, 101 deletions
diff --git a/Doc/c-api/buffer.rst b/Doc/c-api/buffer.rst
index a75e450472..6ad4f7b5a5 100644
--- a/Doc/c-api/buffer.rst
+++ b/Doc/c-api/buffer.rst
@@ -137,7 +137,7 @@ Buffer related functions
Return 1 if *obj* supports the buffer interface otherwise 0.
-.. cfunction:: int PyObject_GetBuffer(PyObject *obj, PyObject *view, int flags)
+.. cfunction:: int PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags)
Export *obj* into a :ctype:`Py_buffer`, *view*. These arguments must
never be *NULL*. The *flags* argument is a bit field indicating what
diff --git a/Doc/c-api/sequence.rst b/Doc/c-api/sequence.rst
index 6be9810a53..d8631770fb 100644
--- a/Doc/c-api/sequence.rst
+++ b/Doc/c-api/sequence.rst
@@ -50,7 +50,7 @@ Sequence Protocol
.. cfunction:: PyObject* PySequence_GetItem(PyObject *o, Py_ssize_t i)
- Return the *i*th element of *o*, or *NULL* on failure. This is the equivalent of
+ Return the *i*\ th element of *o*, or *NULL* on failure. This is the equivalent of
the Python expression ``o[i]``.
@@ -62,14 +62,14 @@ Sequence Protocol
.. cfunction:: int PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v)
- Assign object *v* to the *i*th element of *o*. Returns ``-1`` on failure. This
+ Assign object *v* to the *i*\ th element of *o*. Returns ``-1`` on failure. This
is the equivalent of the Python statement ``o[i] = v``. This function *does
not* steal a reference to *v*.
.. cfunction:: int PySequence_DelItem(PyObject *o, Py_ssize_t i)
- Delete the *i*th element of object *o*. Returns ``-1`` on failure. This is the
+ Delete the *i*\ th element of object *o*. Returns ``-1`` on failure. This is the
equivalent of the Python statement ``del o[i]``.
@@ -131,7 +131,7 @@ Sequence Protocol
.. cfunction:: PyObject* PySequence_Fast_GET_ITEM(PyObject *o, Py_ssize_t i)
- Return the *i*th element of *o*, assuming that *o* was returned by
+ Return the *i*\ th element of *o*, assuming that *o* was returned by
:cfunc:`PySequence_Fast`, *o* is not *NULL*, and that *i* is within bounds.
@@ -147,7 +147,7 @@ Sequence Protocol
.. cfunction:: PyObject* PySequence_ITEM(PyObject *o, Py_ssize_t i)
- Return the *i*th element of *o* or *NULL* on failure. Macro form of
+ Return the *i*\ th element of *o* or *NULL* on failure. Macro form of
:cfunc:`PySequence_GetItem` but without checking that
:cfunc:`PySequence_Check(o)` is true and without adjustment for negative
indices.
diff --git a/Doc/conf.py b/Doc/conf.py
index 551452babd..352c15f411 100644
--- a/Doc/conf.py
+++ b/Doc/conf.py
@@ -46,6 +46,9 @@ unused_docs = [
'library/xml.etree',
]
+# Ignore .rst in Sphinx its self.
+exclude_trees = ['tools/sphinx']
+
# Relative filename of the reference count data file.
refcount_file = 'data/refcounts.dat'
diff --git a/Doc/library/ctypes.rst b/Doc/library/ctypes.rst
index ba80478a7c..039289a0b2 100644
--- a/Doc/library/ctypes.rst
+++ b/Doc/library/ctypes.rst
@@ -1207,8 +1207,7 @@ constructs a new Python object each time!
Variable-sized data types
^^^^^^^^^^^^^^^^^^^^^^^^^
-``ctypes`` provides some support for variable-sized arrays and structures (this
-was added in version 0.9.9.7).
+``ctypes`` provides some support for variable-sized arrays and structures.
The ``resize`` function can be used to resize the memory buffer of an existing
ctypes object. The function takes the object as first argument, and the
diff --git a/Doc/library/email-examples.rst b/Doc/library/email-examples.rst
index f606f9bb3b..c1b16da394 100644
--- a/Doc/library/email-examples.rst
+++ b/Doc/library/email-examples.rst
@@ -1,3 +1,5 @@
+.. _email-examples:
+
:mod:`email`: Examples
----------------------
diff --git a/Doc/library/exceptions.rst b/Doc/library/exceptions.rst
index 7d8e1b3c10..43fa9b099d 100644
--- a/Doc/library/exceptions.rst
+++ b/Doc/library/exceptions.rst
@@ -73,9 +73,9 @@ The following exceptions are only used as base classes for other exceptions.
.. exception:: LookupError
- The base class for the exceptions that are raised when a key or index used on a
- mapping or sequence is invalid: :exc:`IndexError`, :exc:`KeyError`. This can be
- raised directly by :func:`sys.setdefaultencoding`.
+ The base class for the exceptions that are raised when a key or index used on
+ a mapping or sequence is invalid: :exc:`IndexError`, :exc:`KeyError`. This
+ can be raised directly by :func:`codecs.lookup`.
.. exception:: EnvironmentError
diff --git a/Doc/library/functions.rst b/Doc/library/functions.rst
index f0c7195b2b..732dfa2a0d 100644
--- a/Doc/library/functions.rst
+++ b/Doc/library/functions.rst
@@ -1209,7 +1209,7 @@ are always available. They are listed here in alphabetical order.
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
- >>> x == x2, y == y2
+ >>> x == list(x2) and y == list(y2)
True
@@ -1272,7 +1272,7 @@ are always available. They are listed here in alphabetical order.
names.
If you simply want to import a module (potentially within a package) by name,
- you can get it from :data:`sys.modules`::
+ you can call :func:`__import__` and then look it up in :data:`sys.modules`::
>>> import sys
>>> name = 'foo.bar.baz'
diff --git a/Doc/library/http.client.rst b/Doc/library/http.client.rst
index 83629481a3..36322421b9 100644
--- a/Doc/library/http.client.rst
+++ b/Doc/library/http.client.rst
@@ -384,6 +384,8 @@ HTTPConnection Objects
Set the debugging level (the amount of debugging output printed). The default
debug level is ``0``, meaning no debugging output is printed.
+ .. versionadded:: 2.7
+
.. method:: HTTPConnection.connect()
diff --git a/Doc/library/os.rst b/Doc/library/os.rst
index 221374048c..9bb2fc627b 100644
--- a/Doc/library/os.rst
+++ b/Doc/library/os.rst
@@ -386,9 +386,9 @@ by file descriptors.
.. note::
This function is intended for low-level I/O and must be applied to a file
- descriptor as returned by :func:`open` or :func:`pipe`. To close a "file
+ descriptor as returned by :func:`os.open` or :func:`pipe`. To close a "file
object" returned by the built-in function :func:`open` or by :func:`popen` or
- :func:`fdopen`, use its :meth:`close` method.
+ :func:`fdopen`, use its :meth:`~file.close` method.
.. function:: closerange(fd_low, fd_high)
@@ -439,6 +439,9 @@ by file descriptors.
Force write of file with filedescriptor *fd* to disk. Does not force update of
metadata. Availability: Unix.
+ .. note::
+ This function is not available on MacOS.
+
.. function:: fpathconf(fd, name)
@@ -514,8 +517,8 @@ by file descriptors.
.. note::
This function is intended for low-level I/O. For normal usage, use the built-in
- function :func:`open`, which returns a "file object" with :meth:`read` and
- :meth:`write` methods (and many more). To wrap a file descriptor in a "file
+ function :func:`open`, which returns a "file object" with :meth:`~file.read` and
+ :meth:`~file.write` methods (and many more). To wrap a file descriptor in a "file
object", use :func:`fdopen`.
@@ -544,22 +547,22 @@ by file descriptors.
.. note::
This function is intended for low-level I/O and must be applied to a file
- descriptor as returned by :func:`open` or :func:`pipe`. To read a "file object"
+ descriptor as returned by :func:`os.open` or :func:`pipe`. To read a "file object"
returned by the built-in function :func:`open` or by :func:`popen` or
- :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`read` or :meth:`readline`
- methods.
+ :func:`fdopen`, or :data:`sys.stdin`, use its :meth:`~file.read` or
+ :meth:`~file.readline` methods.
.. function:: tcgetpgrp(fd)
Return the process group associated with the terminal given by *fd* (an open
- file descriptor as returned by :func:`open`). Availability: Unix.
+ file descriptor as returned by :func:`os.open`). Availability: Unix.
.. function:: tcsetpgrp(fd, pg)
Set the process group associated with the terminal given by *fd* (an open file
- descriptor as returned by :func:`open`) to *pg*. Availability: Unix.
+ descriptor as returned by :func:`os.open`) to *pg*. Availability: Unix.
.. function:: ttyname(fd)
@@ -577,13 +580,13 @@ by file descriptors.
.. note::
This function is intended for low-level I/O and must be applied to a file
- descriptor as returned by :func:`open` or :func:`pipe`. To write a "file
+ descriptor as returned by :func:`os.open` or :func:`pipe`. To write a "file
object" returned by the built-in function :func:`open` or by :func:`popen` or
- :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its :meth:`write`
- method.
+ :func:`fdopen`, or :data:`sys.stdout` or :data:`sys.stderr`, use its
+ :meth:`~file.write` method.
The following constants are options for the *flags* parameter to the
-:func:`open` function. They can be combined using the bitwise OR operator
+:func:`~os.open` function. They can be combined using the bitwise OR operator
``|``. Some of them are not available on all platforms. For descriptions of
their availability and use, consult the :manpage:`open(2)` manual page on Unix
or `the MSDN <http://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx>` on Windows.
@@ -660,7 +663,7 @@ Files and Directories
.. note::
Using :func:`access` to check if a user is authorized to e.g. open a file before
- actually doing so using :func:`open` creates a security hole, because the user
+ actually doing so using :func:`open` creates a security hole, because the user
might exploit the short time interval between checking and opening the file to
manipulate it.
diff --git a/Doc/library/rlcompleter.rst b/Doc/library/rlcompleter.rst
index 293160a6fc..6b3befcfee 100644
--- a/Doc/library/rlcompleter.rst
+++ b/Doc/library/rlcompleter.rst
@@ -52,7 +52,7 @@ Completer objects have the following method:
.. method:: Completer.complete(text, state)
- Return the *state*th completion for *text*.
+ Return the *state*\ th completion for *text*.
If called for *text* that doesn't include a period character (``'.'``), it will
complete from names currently defined in :mod:`__main__`, :mod:`builtins` and
diff --git a/Doc/library/smtplib.rst b/Doc/library/smtplib.rst
index 53631207ba..070220e26b 100644
--- a/Doc/library/smtplib.rst
+++ b/Doc/library/smtplib.rst
@@ -364,3 +364,8 @@ example doesn't do any processing of the :rfc:`822` headers. In particular, the
server.sendmail(fromaddr, toaddrs, msg)
server.quit()
+.. note::
+
+ In general, you will want to use the :mod:`email` package's features to
+ construct an email message, which you can then convert to a string and send
+ via :meth:`sendmail`; see :ref:`email-examples`.
diff --git a/Doc/library/subprocess.rst b/Doc/library/subprocess.rst
index 9853e62baf..3318d430ec 100644
--- a/Doc/library/subprocess.rst
+++ b/Doc/library/subprocess.rst
@@ -34,9 +34,12 @@ This module defines one class called :class:`Popen`:
Arguments are:
*args* should be a string, or a sequence of program arguments. The program
- to execute is normally the first item in the args sequence or the string if a
- string is given, but can be explicitly set by using the *executable*
- argument.
+ to execute is normally the first item in the args sequence or the string if
+ a string is given, but can be explicitly set by using the *executable*
+ argument. When *executable* is given, the first item in the args sequence
+ is still treated by most programs as the command name, which can then be
+ different from the actual executable name. On Unix, it becomes the display
+ name for the executing program in utilities such as :program:`ps`.
On Unix, with *shell=False* (default): In this case, the Popen class uses
:meth:`os.execvp` to execute the child program. *args* should normally be a
diff --git a/Doc/reference/simple_stmts.rst b/Doc/reference/simple_stmts.rst
index dc8d2cf60d..ced3398535 100644
--- a/Doc/reference/simple_stmts.rst
+++ b/Doc/reference/simple_stmts.rst
@@ -815,12 +815,8 @@ then you will end up importing ``pkg.mod``. If you execute ``from ..subpkg2
imprt mod`` from within ``pkg.subpkg1`` you will import ``pkg.subpkg2.mod``.
The specification for relative imports is contained within :pep:`328`.
-
-.. index:: builtin: __import__
-
-The built-in function :func:`__import__` is provided to support applications
-that determine which modules need to be loaded dynamically; refer to
-:ref:`built-in-funcs` for additional information.
+:func:`importlib.import_module` is provided to support applications that
+determine which modules need to be loaded dynamically.
.. _future:
diff --git a/Lib/gettext.py b/Lib/gettext.py
index d62ac07516..4c957c0c6a 100644
--- a/Lib/gettext.py
+++ b/Lib/gettext.py
@@ -415,7 +415,6 @@ def translation(domain, localedir=None, languages=None,
if fallback:
return NullTranslations()
raise IOError(ENOENT, 'No translation file found for domain', domain)
- # TBD: do we need to worry about the file pointer getting collected?
# Avoid opening, reading, and parsing the .mo file after it's been done
# once.
result = None
@@ -423,7 +422,8 @@ def translation(domain, localedir=None, languages=None,
key = os.path.abspath(mofile)
t = _translations.get(key)
if t is None:
- t = _translations.setdefault(key, class_(open(mofile, 'rb')))
+ with open(mofile, 'rb') as fp:
+ t = _translations.setdefault(key, class_(fp))
# Copy the translation object to allow setting fallbacks and
# output charset. All other instance data is shared with the
# cached object.
diff --git a/Lib/idlelib/macosxSupport.py b/Lib/idlelib/macosxSupport.py
index b23221e759..b794a83bd5 100644
--- a/Lib/idlelib/macosxSupport.py
+++ b/Lib/idlelib/macosxSupport.py
@@ -88,6 +88,7 @@ def overrideRootMenu(root, flist):
# on an EditorWindow instance that is then passed as the first
# argument to ConfigDialog)
root.instance_dict = flist.inversedict
+ root.instance_dict = flist.inversedict
configDialog.ConfigDialog(root, 'Settings')
diff --git a/Lib/logging/__init__.py b/Lib/logging/__init__.py
index 517a7a94f0..9780c830ae 100644
--- a/Lib/logging/__init__.py
+++ b/Lib/logging/__init__.py
@@ -720,8 +720,12 @@ class Handler(Filterer):
"""
if raiseExceptions:
ei = sys.exc_info()
- traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
- del ei
+ try:
+ traceback.print_exception(ei[0], ei[1], ei[2], None, sys.stderr)
+ except IOError:
+ pass # see issue 5971
+ finally:
+ del ei
class StreamHandler(Handler):
"""
diff --git a/Lib/test/support.py b/Lib/test/support.py
index df114a2188..b91d7328d4 100644
--- a/Lib/test/support.py
+++ b/Lib/test/support.py
@@ -5,6 +5,7 @@ if __name__ != 'test.support':
import contextlib
import errno
+import functools
import socket
import sys
import os
@@ -933,6 +934,16 @@ def threading_cleanup(num_active, num_limbo):
count += 1
time.sleep(0.1)
+def reap_threads(func):
+ @functools.wraps(func)
+ def decorator(*args):
+ key = threading_setup()
+ try:
+ return func(*args)
+ finally:
+ threading_cleanup(*key)
+ return decorator
+
def reap_children():
"""Use this function at the end of test_main() whenever sub-processes
are started. This will help ensure that no extra children (zombies)
diff --git a/Lib/test/test_hashlib.py b/Lib/test/test_hashlib.py
index 594f5dd885..5bfea6b9d2 100644
--- a/Lib/test/test_hashlib.py
+++ b/Lib/test/test_hashlib.py
@@ -267,10 +267,9 @@ class HashLibTestCase(unittest.TestCase):
self.assertEqual(expected_hash, hasher.hexdigest())
-
+@support.reap_threads
def test_main():
support.run_unittest(HashLibTestCase)
-
if __name__ == "__main__":
test_main()
diff --git a/Lib/test/test_os.py b/Lib/test/test_os.py
index c680d8d77a..0600cfc0ee 100644
--- a/Lib/test/test_os.py
+++ b/Lib/test/test_os.py
@@ -35,9 +35,7 @@ class FileTests(unittest.TestCase):
retries += 1
if retries > 10:
# XXX test skipped
- print("couldn't allocate two consecutive fds, "
- "skipping test_closerange", file=sys.stderr)
- return
+ self.skipTest("couldn't allocate two consecutive fds")
first, second = second, os.dup(second)
finally:
os.close(second)
diff --git a/Lib/test/test_unittest.py b/Lib/test/test_unittest.py
index ea331808b3..858f24b7d4 100644
--- a/Lib/test/test_unittest.py
+++ b/Lib/test/test_unittest.py
@@ -3175,7 +3175,7 @@ class TestCleanUp(TestCase):
result = MockResult()
test = TestableTest('testNothing')
- test._result = result
+ test._resultForDoCleanups = result
exc1 = Exception('foo')
exc2 = Exception('bar')
diff --git a/Lib/unittest.py b/Lib/unittest.py
index cdccd8c3cc..9c3024af69 100644
--- a/Lib/unittest.py
+++ b/Lib/unittest.py
@@ -353,7 +353,7 @@ class TestCase(object):
not have a method with the specified name.
"""
self._testMethodName = methodName
- self._result = None
+ self._resultForDoCleanups = None
try:
testMethod = getattr(self, methodName)
except AttributeError:
@@ -457,7 +457,7 @@ class TestCase(object):
if startTestRun is not None:
startTestRun()
- self._result = result
+ self._resultForDoCleanups = result
result.startTest(self)
if getattr(self.__class__, "__unittest_skip__", False):
# If the whole class was skipped.
@@ -511,7 +511,7 @@ class TestCase(object):
def doCleanups(self):
"""Execute all cleanup functions. Normally called for you after
tearDown."""
- result = self._result
+ result = self._resultForDoCleanups
ok = True
while self._cleanups:
function, args, kwargs = self._cleanups.pop(-1)
@@ -732,23 +732,32 @@ class TestCase(object):
if seq1 == seq2:
return
+ seq1_repr = repr(seq1)
+ seq2_repr = repr(seq2)
+ if len(seq1_repr) > 30:
+ seq1_repr = seq1_repr[:30] + '...'
+ if len(seq2_repr) > 30:
+ seq2_repr = seq2_repr[:30] + '...'
+ elements = (seq_type_name.capitalize(), seq1_repr, seq2_repr)
+ differing = '%ss differ: %s != %s\n' % elements
+
for i in range(min(len1, len2)):
try:
item1 = seq1[i]
except (TypeError, IndexError, NotImplementedError):
- differing = ('Unable to index element %d of first %s\n' %
+ differing += ('\nUnable to index element %d of first %s\n' %
(i, seq_type_name))
break
try:
item2 = seq2[i]
except (TypeError, IndexError, NotImplementedError):
- differing = ('Unable to index element %d of second %s\n' %
+ differing += ('\nUnable to index element %d of second %s\n' %
(i, seq_type_name))
break
if item1 != item2:
- differing = ('First differing element %d:\n%s\n%s\n' %
+ differing += ('\nFirst differing element %d:\n%s\n%s\n' %
(i, item1, item2))
break
else:
@@ -756,28 +765,26 @@ class TestCase(object):
type(seq1) != type(seq2)):
# The sequences are the same, but have differing types.
return
- # A catch-all message for handling arbitrary user-defined
- # sequences.
- differing = '%ss differ:\n' % seq_type_name.capitalize()
- if len1 > len2:
- differing = ('First %s contains %d additional '
- 'elements.\n' % (seq_type_name, len1 - len2))
- try:
- differing += ('First extra element %d:\n%s\n' %
- (len2, seq1[len2]))
- except (TypeError, IndexError, NotImplementedError):
- differing += ('Unable to index element %d '
- 'of first %s\n' % (len2, seq_type_name))
- elif len1 < len2:
- differing = ('Second %s contains %d additional '
- 'elements.\n' % (seq_type_name, len2 - len1))
- try:
- differing += ('First extra element %d:\n%s\n' %
- (len1, seq2[len1]))
- except (TypeError, IndexError, NotImplementedError):
- differing += ('Unable to index element %d '
- 'of second %s\n' % (len1, seq_type_name))
- standardMsg = differing + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
+
+ if len1 > len2:
+ differing += ('\nFirst %s contains %d additional '
+ 'elements.\n' % (seq_type_name, len1 - len2))
+ try:
+ differing += ('First extra element %d:\n%s\n' %
+ (len2, seq1[len2]))
+ except (TypeError, IndexError, NotImplementedError):
+ differing += ('Unable to index element %d '
+ 'of first %s\n' % (len2, seq_type_name))
+ elif len1 < len2:
+ differing += ('\nSecond %s contains %d additional '
+ 'elements.\n' % (seq_type_name, len2 - len1))
+ try:
+ differing += ('First extra element %d:\n%s\n' %
+ (len1, seq2[len1]))
+ except (TypeError, IndexError, NotImplementedError):
+ differing += ('Unable to index element %d '
+ 'of second %s\n' % (len1, seq_type_name))
+ standardMsg = differing + '\n' + '\n'.join(difflib.ndiff(pprint.pformat(seq1).splitlines(),
pprint.pformat(seq2).splitlines()))
msg = self._formatMessage(msg, standardMsg)
self.fail(msg)
diff --git a/Lib/zipfile.py b/Lib/zipfile.py
index 5f2efb9b3c..5f2418734d 100644
--- a/Lib/zipfile.py
+++ b/Lib/zipfile.py
@@ -1055,28 +1055,27 @@ class ZipFile:
self.fp.write(zinfo.FileHeader())
return
- fp = io.open(filename, "rb")
- # Must overwrite CRC and sizes with correct data later
- zinfo.CRC = CRC = 0
- zinfo.compress_size = compress_size = 0
- zinfo.file_size = file_size = 0
- self.fp.write(zinfo.FileHeader())
- if zinfo.compress_type == ZIP_DEFLATED:
- cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
- zlib.DEFLATED, -15)
- else:
- cmpr = None
- while 1:
- buf = fp.read(1024 * 8)
- if not buf:
- break
- file_size = file_size + len(buf)
- CRC = crc32(buf, CRC) & 0xffffffff
- if cmpr:
- buf = cmpr.compress(buf)
- compress_size = compress_size + len(buf)
- self.fp.write(buf)
- fp.close()
+ with open(filename, "rb") as fp:
+ # Must overwrite CRC and sizes with correct data later
+ zinfo.CRC = CRC = 0
+ zinfo.compress_size = compress_size = 0
+ zinfo.file_size = file_size = 0
+ self.fp.write(zinfo.FileHeader())
+ if zinfo.compress_type == ZIP_DEFLATED:
+ cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
+ zlib.DEFLATED, -15)
+ else:
+ cmpr = None
+ while 1:
+ buf = fp.read(1024 * 8)
+ if not buf:
+ break
+ file_size = file_size + len(buf)
+ CRC = crc32(buf, CRC) & 0xffffffff
+ if cmpr:
+ buf = cmpr.compress(buf)
+ compress_size = compress_size + len(buf)
+ self.fp.write(buf)
if cmpr:
buf = cmpr.flush()
compress_size = compress_size + len(buf)
@@ -1400,9 +1399,8 @@ def main(args = None):
tgtdir = os.path.dirname(tgt)
if not os.path.exists(tgtdir):
os.makedirs(tgtdir)
- fp = io.open(tgt, 'wb')
- fp.write(zf.read(path))
- fp.close()
+ with open(tgt, 'wb') as fp:
+ fp.write(zf.read(path))
zf.close()
elif args[0] == '-c':
diff --git a/Tools/freeze/makeconfig.py b/Tools/freeze/makeconfig.py
index e2a181ce19..8eb0879a2f 100644
--- a/Tools/freeze/makeconfig.py
+++ b/Tools/freeze/makeconfig.py
@@ -3,7 +3,7 @@ import re
# Write the config.c file
-never = ['marshal', '__main__', 'builtins', 'sys', 'exceptions']
+never = ['marshal', '__main__', 'builtins', 'sys', 'exceptions', '_warnings']
def makeconfig(infp, outfp, modules, with_ifdef=0):
m1 = re.compile('-- ADDMODULE MARKER 1 --')