diff --git a/Tests/test_file_png.py b/Tests/test_file_png.py index 35c82a4fb..14ad6fae1 100644 --- a/Tests/test_file_png.py +++ b/Tests/test_file_png.py @@ -713,13 +713,20 @@ class TestFilePng: with pytest.raises(EOFError): im.seek(1) - def test_save_stdout(self): + @pytest.mark.parametrize("buffer", (True, False)) + def test_save_stdout(self, buffer): old_stdout = sys.stdout.buffer - class MyStdOut: - buffer = BytesIO() + if buffer: - sys.stdout = mystdout = MyStdOut() + class MyStdOut: + buffer = BytesIO() + + mystdout = MyStdOut() + else: + mystdout = BytesIO() + + sys.stdout = mystdout with Image.open(TEST_PNG_FILE) as im: im.save(sys.stdout, "PNG") @@ -727,7 +734,9 @@ class TestFilePng: # Reset stdout sys.stdout = old_stdout - reloaded = Image.open(mystdout.buffer) + if buffer: + mystdout = mystdout.buffer + reloaded = Image.open(mystdout) assert_image_equal_tofile(reloaded, TEST_PNG_FILE) diff --git a/Tests/test_psdraw.py b/Tests/test_psdraw.py index 30cd1c2e0..cda6a2be1 100644 --- a/Tests/test_psdraw.py +++ b/Tests/test_psdraw.py @@ -2,6 +2,8 @@ import os import sys from io import BytesIO +import pytest + from PIL import Image, PSDraw @@ -44,14 +46,21 @@ def test_draw_postscript(tmp_path): assert os.path.getsize(tempfile) > 0 -def test_stdout(): +@pytest.mark.parametrize("buffer", (True, False)) +def test_stdout(buffer): # Temporarily redirect stdout old_stdout = sys.stdout.buffer - class MyStdOut: - buffer = BytesIO() + if buffer: - sys.stdout = mystdout = MyStdOut() + class MyStdOut: + buffer = BytesIO() + + mystdout = MyStdOut() + else: + mystdout = BytesIO() + + sys.stdout = mystdout ps = PSDraw.PSDraw() _create_document(ps) @@ -59,4 +68,6 @@ def test_stdout(): # Reset stdout sys.stdout = old_stdout - assert mystdout.buffer.getvalue() != b"" + if buffer: + mystdout = mystdout.buffer + assert mystdout.getvalue() != b"" diff --git a/docs/handbook/tutorial.rst b/docs/handbook/tutorial.rst index 1102f09be..cdac0ae2d 100644 --- a/docs/handbook/tutorial.rst +++ b/docs/handbook/tutorial.rst @@ -424,7 +424,7 @@ Drawing PostScript title = "hopper" box = (1*72, 2*72, 7*72, 10*72) # in points - ps = PSDraw.PSDraw() # default is sys.stdout.buffer + ps = PSDraw.PSDraw() # default is sys.stdout or sys.stdout.buffer ps.begin_document(title) # draw the image (75 dpi) diff --git a/src/PIL/Image.py b/src/PIL/Image.py index 105dbb34d..73d8ce084 100644 --- a/src/PIL/Image.py +++ b/src/PIL/Image.py @@ -2136,7 +2136,10 @@ class Image: filename = str(fp) open_fp = True elif fp == sys.stdout: - fp = sys.stdout.buffer + try: + fp = sys.stdout.buffer + except AttributeError: + pass if not filename and hasattr(fp, "name") and isPath(fp.name): # only set the name for metadata purposes filename = fp.name diff --git a/src/PIL/ImageFile.py b/src/PIL/ImageFile.py index 6917e09a2..daf732de1 100644 --- a/src/PIL/ImageFile.py +++ b/src/PIL/ImageFile.py @@ -493,7 +493,7 @@ def _save(im, fp, tile, bufsize=0): # But, it would need at least the image size in most cases. RawEncode is # a tricky case. bufsize = max(MAXBLOCK, bufsize, im.size[0] * 4) # see RawEncode.c - if fp == sys.stdout.buffer: + if fp == sys.stdout or (hasattr(sys.stdout, "buffer") and fp == sys.stdout.buffer): fp.flush() return try: diff --git a/src/PIL/PSDraw.py b/src/PIL/PSDraw.py index d62d3fd65..743c35f01 100644 --- a/src/PIL/PSDraw.py +++ b/src/PIL/PSDraw.py @@ -26,12 +26,15 @@ from . import EpsImagePlugin class PSDraw: """ Sets up printing to the given file. If ``fp`` is omitted, - ``sys.stdout.buffer`` is assumed. + ``sys.stdout.buffer`` or ``sys.stdout`` is assumed. """ def __init__(self, fp=None): if not fp: - fp = sys.stdout.buffer + try: + fp = sys.stdout.buffer + except AttributeError: + fp = sys.stdout self.fp = fp def begin_document(self, id=None):