##// END OF EJS Templates
Fix broken create/shutdown code
Julia Evans -
Show More
@@ -1,116 +1,115 b''
1 1 """Module containing a preprocessor that removes the outputs from code cells"""
2 2
3 3 # Copyright (c) IPython Development Team.
4 4 # Distributed under the terms of the Modified BSD License.
5 5
6 6 #-----------------------------------------------------------------------------
7 7 # Imports
8 8 #-----------------------------------------------------------------------------
9 9
10 10 import os
11 11 import sys
12 12
13 13 from Queue import Empty
14 14 from IPython.kernel import KernelManager
15 15 from IPython.nbformat.current import reads, NotebookNode, writes
16 16
17 17 from .base import Preprocessor
18 18
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Classes
22 22 #-----------------------------------------------------------------------------
23 23 class ExecutePreprocessor(Preprocessor):
24 24 """
25 25 Executes all the cells in a notebook
26 26 """
27 27 def __init__(self, extra_arguments=[], **kwargs):
28 28 """
29 29 Start an kernel to run the Python code
30 30 """
31 31 super(ExecutePreprocessor, self).__init__(**kwargs)
32 32 self.extra_arguments = []
33 33
34 def preprocess(self, nb, resources):
34 def _create_client(self):
35 35 self.km = KernelManager()
36 36 self.km.start_kernel(extra_arguments=self.extra_arguments, stderr=open(os.devnull, 'w'))
37 37 self.kc = self.km.client()
38 38 self.kc.start_channels()
39 39 self.iopub = self.kc.iopub_channel
40 40 self.shell = self.kc.shell_channel
41
42 41 self.shell.execute("pass")
43 42 self.shell.get_msg()
44 43
44 def _shutdown_client(self):
45 self.kc.stop_channels()
46 self.km.shutdown_kernel()
47 del self.km
45 48
46 create_client()
49 def preprocess(self, nb, resources):
50 self._create_client()
47 51 nb, resources = super(ExecutePreprocessor, self).preprocess(nb, resources)
48 shutdown_client()
52 self._shutdown_client()
49 53 return nb, resources
50 54
51 55 def preprocess_cell(self, cell, resources, cell_index):
52 56 """
53 57 Apply a transformation on each code cell. See base.py for details.
54 58 """
55 59 if cell.cell_type != 'code':
56 60 return cell, resources
57 61 try:
58 62 outputs = self.run_cell(self.shell, self.iopub, cell)
59 63 except Exception as e:
60 64 self.log.error("failed to run cell: " + repr(e))
61 65 self.log.error(str(cell.input))
62 66 sys.exit(1)
63 67 cell.outputs = outputs
64 68 return cell, resources
65 69
66 70 @staticmethod
67 71 def run_cell(shell, iopub, cell):
68 72 # print cell.input
69 73 shell.execute(cell.input)
70 74 # wait for finish, maximum 20s
71 75 shell.get_msg(timeout=20)
72 76 outs = []
73 77
74 78 while True:
75 79 try:
76 80 msg = iopub.get_msg(timeout=0.2)
77 81 except Empty:
78 82 break
79 83 msg_type = msg['msg_type']
80 84 if msg_type in ('status', 'pyin'):
81 85 continue
82 86 elif msg_type == 'clear_output':
83 87 outs = []
84 88 continue
85 89
86 90 content = msg['content']
87 91 # print msg_type, content
88 92 out = NotebookNode(output_type=msg_type)
89 93
90 94 if msg_type == 'stream':
91 95 out.stream = content['name']
92 96 out.text = content['data']
93 97 elif msg_type in ('display_data', 'pyout'):
94 98 out['metadata'] = content['metadata']
95 99 for mime, data in content['data'].iteritems():
96 100 attr = mime.split('/')[-1].lower()
97 101 # this gets most right, but fix svg+html, plain
98 102 attr = attr.replace('+xml', '').replace('plain', 'text')
99 103 setattr(out, attr, data)
100 104 if msg_type == 'pyout':
101 105 out.prompt_number = content['execution_count']
102 106 elif msg_type == 'pyerr':
103 107 out.ename = content['ename']
104 108 out.evalue = content['evalue']
105 109 out.traceback = content['traceback']
106 110 else:
107 111 self.log.error("unhandled iopub msg: " + msg_type)
108 112
109 113 outs.append(out)
110 114 return outs
111 115
112
113 def __del__(self):
114 self.kc.stop_channels()
115 self.km.shutdown_kernel()
116 del self.km
General Comments 0
You need to be logged in to leave comments. Login now