IPython allows to define custom magics. A very rough draft would be:
from base64 import b64decode
from io import BytesIO
from IPython import get_ipython
from IPython.core.magic import register_cell_magic
import PIL
@register_cell_magic
def capture_png(line, cell):
get_ipython().run_cell_magic(
'capture',
' --no-stderr --no-stdout result',
cell
)
out_paths = line.strip().split(' ')
for output in result.outputs:
data = output.data
if 'image/png' in data:
path = out_paths.pop(0)
if not path:
raise ValueError('Too few paths given!')
png_bytes = data['image/png']
if isinstance(png_bytes, str):
png_bytes = b64decode(png_bytes)
assert isinstance(png_bytes, bytes)
bytes_io = BytesIO(png_bytes)
image = PIL.Image.open(bytes_io)
image.save(path, 'png')
And you could use it like:
%%capture_png test_copy.png hist.png
from IPython.display import Image
from pandas import Series
display(Image('test.png'))
Series([1, 2, 2, 3, 3, 3]).hist()