Skip to content

Commit dea09d5

Browse files
committed
find_output
1 parent 19f40e4 commit dea09d5

File tree

4 files changed

+203
-13
lines changed

4 files changed

+203
-13
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
# execnb
22

3+
34
<!-- WARNING: THIS FILE WAS AUTOGENERATED! DO NOT EDIT! -->
45

56
[![CI](https://github.com/fastai/execnb/actions/workflows/test.yaml/badge.svg)](https://github.com/fastai/execnb/actions/workflows/test.yaml)

execnb/_modidx.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,8 @@
4646
'execnb.shell._format_mimedata': ('shell.html#_format_mimedata', 'execnb/shell.py'),
4747
'execnb.shell._out_exc': ('shell.html#_out_exc', 'execnb/shell.py'),
4848
'execnb.shell._out_stream': ('shell.html#_out_stream', 'execnb/shell.py'),
49-
'execnb.shell.exec_nb': ('shell.html#exec_nb', 'execnb/shell.py')}}}
49+
'execnb.shell.exec_nb': ('shell.html#exec_nb', 'execnb/shell.py'),
50+
'execnb.shell.find_output': ('shell.html#find_output', 'execnb/shell.py'),
51+
'execnb.shell.out_error': ('shell.html#out_error', 'execnb/shell.py'),
52+
'execnb.shell.out_exec': ('shell.html#out_exec', 'execnb/shell.py'),
53+
'execnb.shell.out_stream': ('shell.html#out_stream', 'execnb/shell.py')}}}

execnb/shell.py

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from collections.abc import Callable
3030

3131
# %% auto 0
32-
__all__ = ['CaptureShell', 'exec_nb']
32+
__all__ = ['CaptureShell', 'find_output', 'out_exec', 'out_stream', 'out_error', 'exec_nb']
3333

3434
# %% ../nbs/02_shell.ipynb 4
3535
# IPython requires a DisplayHook and DisplayPublisher
@@ -155,7 +155,32 @@ def cell(self:CaptureShell, cell, stdout=True, stderr=True):
155155
for o in outs:
156156
if 'execution_count' in o: cell['execution_count'] = o['execution_count']
157157

158-
# %% ../nbs/02_shell.ipynb 28
158+
# %% ../nbs/02_shell.ipynb 27
159+
def find_output(outp, # Output from `run`
160+
ot='execute_result' # Output_type to find
161+
):
162+
"Find first output of type `ot` in `CaptureShell.run` output"
163+
return first(o for o in outp if o['output_type']==ot)
164+
165+
# %% ../nbs/02_shell.ipynb 30
166+
def out_exec(outp):
167+
"Get data from execution result in `outp`."
168+
out = find_output(outp)
169+
if out: return '\n'.join(first(out['data'].values()))
170+
171+
# %% ../nbs/02_shell.ipynb 32
172+
def out_stream(outp):
173+
"Get text from stream in `outp`."
174+
out = find_output(outp, 'stream')
175+
if out: return ('\n'.join(out['text'])).strip()
176+
177+
# %% ../nbs/02_shell.ipynb 34
178+
def out_error(outp):
179+
"Get traceback from error in `outp`."
180+
out = find_output(outp, 'error')
181+
if out: return '\n'.join(out['traceback'])
182+
183+
# %% ../nbs/02_shell.ipynb 37
159184
def _false(o): return False
160185

161186
@patch
@@ -175,7 +200,7 @@ def run_all(self:CaptureShell,
175200
postproc(cell)
176201
if self.exc and exc_stop: raise self.exc[1] from None
177202

178-
# %% ../nbs/02_shell.ipynb 42
203+
# %% ../nbs/02_shell.ipynb 51
179204
@patch
180205
def execute(self:CaptureShell,
181206
src:str|Path, # Notebook path to read from
@@ -196,7 +221,7 @@ def execute(self:CaptureShell,
196221
inject_code=inject_code, inject_idx=inject_idx)
197222
if dest: write_nb(nb, dest)
198223

199-
# %% ../nbs/02_shell.ipynb 46
224+
# %% ../nbs/02_shell.ipynb 55
200225
@patch
201226
def prettytb(self:CaptureShell,
202227
fname:str|Path=None): # filename to print alongside the traceback
@@ -208,7 +233,7 @@ def prettytb(self:CaptureShell,
208233
fname_str = f' in {fname}' if fname else ''
209234
return f"{type(self.exc[1]).__name__}{fname_str}:\n{_fence}\n{cell_str}\n"
210235

211-
# %% ../nbs/02_shell.ipynb 65
236+
# %% ../nbs/02_shell.ipynb 74
212237
@call_parse
213238
def exec_nb(
214239
src:str, # Notebook path to read from

nbs/02_shell.ipynb

Lines changed: 167 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,8 +274,8 @@
274274
"text/plain": [
275275
"[{'name': 'stdout',\n",
276276
" 'output_type': 'stream',\n",
277-
" 'text': ['CPU times: user 3 us, sys: 0 ns, total: 3 us\\n',\n",
278-
" 'Wall time: 5.72 us\\n']},\n",
277+
" 'text': ['CPU times: user 1e+03 ns, sys: 1 us, total: 2 us\\n',\n",
278+
" 'Wall time: 3.1 us\\n']},\n",
279279
" {'data': {'text/plain': ['2']},\n",
280280
" 'metadata': {},\n",
281281
" 'output_type': 'execute_result',\n",
@@ -359,9 +359,9 @@
359359
"outputs": [
360360
{
361361
"data": {
362-
"image/png": "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",
362+
"image/png": "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",
363363
"text/plain": [
364-
"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=84x87>"
364+
"<PIL.PngImagePlugin.PngImageFile image mode=RGBA size=117x122>"
365365
]
366366
},
367367
"execution_count": null,
@@ -401,7 +401,7 @@
401401
}
402402
],
403403
"source": [
404-
"s.run('raise Exception(\"Oops\")')\n",
404+
"err_res = s.run('raise Exception(\"Oops\")')\n",
405405
"typ,obj,st = s.exc\n",
406406
"typ,obj"
407407
]
@@ -417,7 +417,7 @@
417417
"text": [
418418
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n",
419419
"\u001b[0;31mException\u001b[0m Traceback (most recent call last)\n",
420-
"Input \u001b[0;32mIn [1]\u001b[0m, in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n",
420+
"Cell \u001b[0;32mIn[1], line 1\u001b[0m\n",
421421
"\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOops\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
422422
"\n",
423423
"\u001b[0;31mException\u001b[0m: Oops\n"
@@ -499,7 +499,7 @@
499499
" {'data': {'text/plain': ['2']},\n",
500500
" 'metadata': {},\n",
501501
" 'output_type': 'execute_result',\n",
502-
" 'execution_count': 3}]"
502+
" 'execution_count': 4}]"
503503
]
504504
},
505505
"execution_count": null,
@@ -512,6 +512,166 @@
512512
"c.outputs"
513513
]
514514
},
515+
{
516+
"cell_type": "code",
517+
"execution_count": null,
518+
"metadata": {},
519+
"outputs": [],
520+
"source": [
521+
"#| export\n",
522+
"def find_output(outp, # Output from `run`\n",
523+
" ot='execute_result' # Output_type to find\n",
524+
" ):\n",
525+
" \"Find first output of type `ot` in `CaptureShell.run` output\"\n",
526+
" return first(o for o in outp if o['output_type']==ot)"
527+
]
528+
},
529+
{
530+
"cell_type": "code",
531+
"execution_count": null,
532+
"metadata": {},
533+
"outputs": [
534+
{
535+
"data": {
536+
"text/markdown": [
537+
"```json\n",
538+
"{'text/plain': ['2']}\n",
539+
"```"
540+
],
541+
"text/plain": [
542+
"{'text/plain': ['2']}"
543+
]
544+
},
545+
"execution_count": null,
546+
"metadata": {},
547+
"output_type": "execute_result"
548+
}
549+
],
550+
"source": [
551+
"find_output(c.outputs)['data']"
552+
]
553+
},
554+
{
555+
"cell_type": "code",
556+
"execution_count": null,
557+
"metadata": {},
558+
"outputs": [
559+
{
560+
"data": {
561+
"text/plain": [
562+
"['1\\n']"
563+
]
564+
},
565+
"execution_count": null,
566+
"metadata": {},
567+
"output_type": "execute_result"
568+
}
569+
],
570+
"source": [
571+
"find_output(c.outputs, 'stream')['text']"
572+
]
573+
},
574+
{
575+
"cell_type": "code",
576+
"execution_count": null,
577+
"metadata": {},
578+
"outputs": [],
579+
"source": [
580+
"#| export\n",
581+
"def out_exec(outp):\n",
582+
" \"Get data from execution result in `outp`.\"\n",
583+
" out = find_output(outp)\n",
584+
" if out: return '\\n'.join(first(out['data'].values()))"
585+
]
586+
},
587+
{
588+
"cell_type": "code",
589+
"execution_count": null,
590+
"metadata": {},
591+
"outputs": [
592+
{
593+
"data": {
594+
"text/plain": [
595+
"'2'"
596+
]
597+
},
598+
"execution_count": null,
599+
"metadata": {},
600+
"output_type": "execute_result"
601+
}
602+
],
603+
"source": [
604+
"out_exec(c.outputs)"
605+
]
606+
},
607+
{
608+
"cell_type": "code",
609+
"execution_count": null,
610+
"metadata": {},
611+
"outputs": [],
612+
"source": [
613+
"#| export\n",
614+
"def out_stream(outp):\n",
615+
" \"Get text from stream in `outp`.\"\n",
616+
" out = find_output(outp, 'stream')\n",
617+
" if out: return ('\\n'.join(out['text'])).strip()"
618+
]
619+
},
620+
{
621+
"cell_type": "code",
622+
"execution_count": null,
623+
"metadata": {},
624+
"outputs": [
625+
{
626+
"data": {
627+
"text/plain": [
628+
"'1'"
629+
]
630+
},
631+
"execution_count": null,
632+
"metadata": {},
633+
"output_type": "execute_result"
634+
}
635+
],
636+
"source": [
637+
"out_stream(c.outputs)"
638+
]
639+
},
640+
{
641+
"cell_type": "code",
642+
"execution_count": null,
643+
"metadata": {},
644+
"outputs": [],
645+
"source": [
646+
"#| export\n",
647+
"def out_error(outp):\n",
648+
" \"Get traceback from error in `outp`.\"\n",
649+
" out = find_output(outp, 'error')\n",
650+
" if out: return '\\n'.join(out['traceback'])"
651+
]
652+
},
653+
{
654+
"cell_type": "code",
655+
"execution_count": null,
656+
"metadata": {},
657+
"outputs": [
658+
{
659+
"name": "stdout",
660+
"output_type": "stream",
661+
"text": [
662+
"\u001b[0;31m---------------------------------------------------------------------------\u001b[0m\n",
663+
"\u001b[0;31mException\u001b[0m Traceback (most recent call last)\n",
664+
"Cell \u001b[0;32mIn[1], line 1\u001b[0m\n",
665+
"\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mOops\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
666+
"\n",
667+
"\u001b[0;31mException\u001b[0m: Oops\n"
668+
]
669+
}
670+
],
671+
"source": [
672+
"print(out_error(err_res))"
673+
]
674+
},
515675
{
516676
"cell_type": "markdown",
517677
"metadata": {},

0 commit comments

Comments
 (0)