gh-135648: Document that shutil.copyfileobj doesn't flush (#135737)

Adds a note about flush/close on copyfileobj, and updates 
the Emscripten build script to follow documented advice.
This commit is contained in:
Russell Keith-Magee 2025-06-24 08:55:50 +08:00 committed by GitHub
parent 2793b68f75
commit 34393cbdd4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 9 additions and 1 deletions

View file

@ -47,6 +47,13 @@ Directory and files operations
0, only the contents from the current file position to the end of the file will
be copied.
:func:`copyfileobj` will *not* guarantee that the destination stream has
been flushed on completion of the copy. If you want to read from the
destination at the completion of the copy operation (for example, reading
the contents of a temporary file that has been copied from a HTTP stream),
you must ensure that you have called :func:`~io.IOBase.flush` or
:func:`~io.IOBase.close` on the file-like object before attempting to read
the destination file.
.. function:: copyfile(src, dst, *, follow_symlinks=True)

View file

@ -167,11 +167,12 @@ def make_build_python(context, working_dir):
@subdir(HOST_BUILD_DIR, clean_ok=True)
def make_emscripten_libffi(context, working_dir):
shutil.rmtree(working_dir / "libffi-3.4.6", ignore_errors=True)
with tempfile.NamedTemporaryFile(suffix=".tar.gz") as tmp_file:
with tempfile.NamedTemporaryFile(suffix=".tar.gz", delete_on_close=False) as tmp_file:
with urlopen(
"https://github.com/libffi/libffi/releases/download/v3.4.6/libffi-3.4.6.tar.gz"
) as response:
shutil.copyfileobj(response, tmp_file)
tmp_file.close()
shutil.unpack_archive(tmp_file.name, working_dir)
call(
[EMSCRIPTEN_DIR / "make_libffi.sh"],