1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
# ! python
# coding: utf-8
# From https://gist.github.com/tpogden/ec79f2ebe2baf45655445b575dc7f540
# with some more context at https://ogden.eu/run-notebooks
# Thanks to @tpogden for his gist
import os
import sys
import argparse
import glob
import nbformat
from nbconvert.preprocessors import ExecutePreprocessor
from nbconvert.preprocessors.execute import CellExecutionError
# Parse args
parser = argparse.ArgumentParser(description="Runs a set of Jupyter \
notebooks.")
file_text = """ Notebook file(s) to be run, e.g. '*.ipynb' (default),
'my_nb1.ipynb', 'my_nb1.ipynb my_nb2.ipynb', 'my_dir/*.ipynb'
"""
parser.add_argument('file_list', metavar='F', type=str, nargs='*',
help=file_text)
parser.add_argument('-t', '--timeout', help='Length of time (in secs) a cell \
can run before raising TimeoutError (default 600).', default=600,
required=False)
parser.add_argument('-p', '--run-path', help='The path the notebook will be \
run from (default pwd).', default='.', required=False)
args = parser.parse_args()
print('Args:', args)
if not args.file_list: # Default file_list
args.file_list = glob.glob('*.ipynb')
# Check list of notebooks
notebooks = []
print('Notebooks to run:')
for f in args.file_list:
# Find notebooks but not notebooks previously output from this script
if f.endswith('.ipynb') and not f.endswith('_out.ipynb'):
print(f[:-6])
notebooks.append(f[:-6]) # Want the filename without '.ipynb'
# Execute notebooks and output
num_notebooks = len(notebooks)
print('*****')
for i, n in enumerate(notebooks):
n_out = n + '_out'
with open(n + '.ipynb') as f:
nb = nbformat.read(f, as_version=4)
ep = ExecutePreprocessor(timeout=int(args.timeout), kernel_name='python3')
try:
print('Running', n, ':', i, '/', num_notebooks)
out = ep.preprocess(nb, {'metadata': {'path': args.run_path}})
except CellExecutionError:
out = None
msg = 'Error executing the notebook "%s".\n' % n
msg += 'See notebook "%s" for the traceback.' % n_out
print(msg)
sys.exit(1)
except TimeoutError:
msg = 'Timeout executing the notebook "%s".\n' % n
print(msg)
sys.exit(110)
finally:
# Write output file
with open(n_out + '.ipynb', mode='wt') as f:
nbformat.write(nb, f)
|