##// END OF EJS Templates
fix %autopx in scripts by calling run_code for each ast node...
MinRK -
Show More
@@ -2211,15 +2211,20 b' class InteractiveShell(Configurable, Magic):'
2211 2211
2212 2212 exec_count = self.execution_count
2213 2213 if to_run_exec:
2214 mod = ast.Module(to_run_exec)
2215 self.code_to_run = code = self.compile(mod, cell_name, "exec")
2216 if self.run_code(code) == 1:
2217 return
2218
2214 for i, node in enumerate(to_run_exec):
2215 mod = ast.Module([node])
2216 self.code_to_run = code = self.compile(mod, cell_name+str(i), "exec")
2217 if self.run_code(code) == 1:
2218 return 1
2219
2219 2220 if to_run_interactive:
2220 mod = ast.Interactive(to_run_interactive)
2221 self.code_to_run = code = self.compile(mod, cell_name, "single")
2222 return self.run_code(code)
2221 for i, node in enumerate(to_run_interactive):
2222 mod = ast.Interactive([node])
2223 self.code_to_run = code = self.compile(mod, cell_name, "single")
2224 if self.run_code(code) == 1:
2225 return 1
2226
2227 return 0
2223 2228
2224 2229
2225 2230 # PENDING REMOVAL: this method is slated for deletion, once our new
@@ -2336,11 +2341,17 b' class InteractiveShell(Configurable, Magic):'
2336 2341 When an exception occurs, self.showtraceback() is called to display a
2337 2342 traceback.
2338 2343
2339 Return value: a flag indicating whether the code to be run completed
2340 successfully:
2344 Parameters
2345 ----------
2346 code_obj : code object
2347 A compiled code object, to be executed
2348 post_execute : bool [default: True]
2349 whether to call post_execute hooks after this particular execution.
2341 2350
2342 - 0: successful execution.
2343 - 1: an error occurred.
2351 Returns
2352 -------
2353 0 : successful execution.
2354 1 : an error occurred.
2344 2355 """
2345 2356
2346 2357 # Set our own excepthook in case the user code tries to call it
@@ -15,12 +15,10 b''
15 15 #-----------------------------------------------------------------------------
16 16
17 17 import ast
18 import new
19 18 import re
20 19
21 20 from IPython.core.plugin import Plugin
22 21 from IPython.utils.traitlets import Bool, Any, Instance
23 from IPython.utils.autoattr import auto_attr
24 22 from IPython.testing import decorators as testdec
25 23
26 24 #-----------------------------------------------------------------------------
@@ -146,10 +144,12 b' class ParalleMagic(Plugin):'
146 144 print NO_ACTIVE_VIEW
147 145 return
148 146
147 # override run_cell and run_code
149 148 self._original_run_cell = self.shell.run_cell
150 self.shell.run_cell = new.instancemethod(
151 self.pxrun_cell, self.shell, self.shell.__class__
152 )
149 self.shell.run_cell = self.pxrun_cell
150 self._original_run_code = self.shell.run_code
151 self.shell.run_code = self.pxrun_code
152
153 153 self.autopx = True
154 154 print "%autopx enabled"
155 155
@@ -158,14 +158,43 b' class ParalleMagic(Plugin):'
158 158 """
159 159 if self.autopx:
160 160 self.shell.run_cell = self._original_run_cell
161 self.shell.run_code = self._original_run_code
161 162 self.autopx = False
162 163 print "%autopx disabled"
163 164
164 def pxrun_cell(self, ipself, cell, store_history=True):
165 def _maybe_display_output(self, result):
166 """Maybe display the output of a parallel result.
167
168 If self.active_view.block is True, wait for the result
169 and display the result. Otherwise, this is a noop.
170 """
171 if self.active_view.block:
172 try:
173 result.get()
174 except:
175 self.shell.showtraceback()
176 return True
177 else:
178 targets = self.active_view.targets
179 if isinstance(targets, int):
180 targets = [targets]
181 if targets == 'all':
182 targets = self.active_view.client.ids
183 stdout = [s.rstrip() for s in result.stdout]
184 if any(stdout):
185 for i,eid in enumerate(targets):
186 print '[stdout:%i]'%eid, stdout[i]
187 return False
188
189
190 def pxrun_cell(self, cell, store_history=True):
165 191 """drop-in replacement for InteractiveShell.run_cell.
166 192
167 193 This executes code remotely, instead of in the local namespace.
194
195 See InteractiveShell.run_cell for details.
168 196 """
197 ipself = self.shell
169 198 raw_cell = cell
170 199 with ipself.builtin_trap:
171 200 cell = ipself.prefilter_manager.prefilter_lines(cell)
@@ -187,6 +216,7 b' class ParalleMagic(Plugin):'
187 216 ipself.execution_count += 1
188 217 return None
189 218 except NameError:
219 # ignore name errors, because we don't know the remote keys
190 220 pass
191 221
192 222 if store_history:
@@ -195,7 +225,6 b' class ParalleMagic(Plugin):'
195 225 ipself.history_manager.store_output(ipself.execution_count)
196 226 # Each cell is a *single* input, regardless of how many lines it has
197 227 ipself.execution_count += 1
198 print cell
199 228
200 229 if re.search(r'get_ipython\(\)\.magic\(u?"%?autopx', cell):
201 230 self._disable_autopx()
@@ -206,23 +235,32 b' class ParalleMagic(Plugin):'
206 235 except:
207 236 ipself.showtraceback()
208 237 return False
209
210 if self.active_view.block:
211 try:
212 result.get()
213 except:
214 ipself.showtraceback()
215 else:
216 targets = self.active_view.targets
217 if isinstance(targets, int):
218 targets = [targets]
219 if targets == 'all':
220 targets = self.active_view.client.ids
221 stdout = [s.rstrip() for s in result.stdout]
222 if any(stdout):
223 for i,eid in enumerate(targets):
224 print '[stdout:%i]'%eid, stdout[i]
238 else:
239 return self._maybe_display_output(result)
240
241 def pxrun_code(self, code_obj, post_execute=True):
242 """drop-in replacement for InteractiveShell.run_code.
243
244 This executes code remotely, instead of in the local namespace.
245
246 See InteractiveShell.run_code for details.
247 """
248 ipself = self.shell
249 # check code object for the autopx magic
250 if 'get_ipython' in code_obj.co_names and 'magic' in code_obj.co_names and \
251 any( [ isinstance(c, basestring) and 'autopx' in c for c in code_obj.co_consts ]):
252 self._disable_autopx()
225 253 return False
254 else:
255 try:
256 result = self.active_view.execute(code_obj, block=False)
257 except:
258 ipself.showtraceback()
259 return False
260 else:
261 return self._maybe_display_output(result)
262
263
226 264
227 265
228 266 _loaded = False
@@ -765,11 +765,11 b' class DirectView(View):'
765 765 print "The IPython parallel magics (%result, %px, %autopx) only work within IPython."
766 766 else:
767 767 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
768 if pmagic is not None:
769 pmagic.active_view = self
770 else:
771 print "You must first load the parallelmagic extension " \
772 "by doing '%load_ext parallelmagic'"
768 if pmagic is None:
769 ip.magic_load_ext('parallelmagic')
770 pmagic = ip.plugin_manager.get_plugin('parallelmagic')
771
772 pmagic.active_view = self
773 773
774 774
775 775 @testdec.skip_doctest
General Comments 0
You need to be logged in to leave comments. Login now