It won't process the message from the kill button until after it's done
running the process.

What I'm suggesting is that you rely on Jupyter's interrupt feature (the
stop button in the toolbar) to stop the process, instead of making your own
kill button. To do that, all you need to do is catch the KeyboardInterrupt
exception and call my_proc.terminate() in the exception handler.

On 7 March 2018 at 19:22, Randy Heiland <randy.heil...@gmail.com> wrote:

> Thomas,  Thanks very much! Following that example, I am indeed able to
> capture the output in my Output widget. I'm less clear about how to kill
> the running job (and keep the rest of the notebook alive). Here's my latest
> code, fwiw:
>
> import ipywidgets as widgets
> from subprocess import Popen, PIPE, STDOUT
>
> run_output = widgets.Output(layout=widgets.Layout(width='500px',
> height='100px', border='solid'))
> def run_cb(b):
>     global my_proc
>     print('run sim...')
>     with run_output:
>         args = ['hello']
>         my_proc = Popen(args, stdout=PIPE, stderr=STDOUT)
>
>     # This should be safe because we're not piping stdin to the process.
>     # It gets tricky if we are, because the process can be waiting for
> input while we're waiting for output.
>     while True:
>         # Wait for some output, read it and print it.
>         with run_output:
>             my_output = my_proc.stdout.read1(1024).decode('utf-8')
>             print(my_output, end='')
>
>         # Has the subprocess finished yet?
>         if my_proc.poll() is not None:
>             break
>
>     if my_proc.returncode != 0:
>         print("Exited with error code:", my_proc.returncode)
>
> def kill_cb(b):
>     global my_proc
>     print('kill proc...')
>     my_proc.terminate()
> run_button = widgets.Button(
>     description='Run',
>     disabled=False,
>     button_style='success' # 'success', 'info', 'warning', 'danger' or ''
> )
> kill_button = widgets.Button(
>     description='Kill',
>     disabled=False,
>     button_style='danger'
> )
>
> run_button.on_click(run_cb)
> kill_button.on_click(kill_cb)
> widgets.VBox([run_button, kill_button, run_output])
>
>
> On Wednesday, March 7, 2018 at 10:38:27 AM UTC-5, takowl wrote:
>>
>> Have a look at this demo notebook:
>> https://github.com/takluyver/rt2-workshop-jupyter/blob/e7fde
>> 6565e28adf31a0f9003094db70c3766bd6d/Subprocess%20output.ipynb
>>
>> It doesn't put output into a widget, but it's using print(), so it should
>> be easy to combine with a widget.
>>
>> If you're happy to kill the process by interrupting the kernel from
>> Jupyter, then it's just a matter of catching KeyboardInterrupt in the
>> Python code.
>>
>> Thomas
>>
>> On 7 March 2018 at 15:03, Randy Heiland <randy....@gmail.com> wrote:
>>
>>> I'd like to be able to display output from a program in an Output
>>> widget. (And I'd like to be able to kill the program from a widget too).
>>> Can someone offer advice?
>>>
>>> import ipywidgets as widgets
>>> import subprocess, os
>>>
>>> run_output = widgets.Output(layout=widgets.Layout(width='500px',
>>> height='100px', border='solid'))
>>> run_output
>>>
>>> def run_cb(b):
>>>     #global run_output
>>>     print('run sim...')
>>>     with run_output:
>>>         print('trying subprocess - does hello output show up?')
>>>         args = ['hello']
>>>         run_proc = subprocess.Popen(args)
>>>         #os.system('hello')
>>>
>>> run_button = widgets.Button(
>>>     description='Run',
>>>     disabled=False,
>>>     button_style='success', # 'success', 'info', 'warning', 'danger' or
>>> ''
>>>     tooltip='Run simulation',
>>> )
>>> run_button.on_click(run_cb)
>>> run_button
>>> widgets.VBox([run_button, run_output])
>>>
>>> where hello.c is simply:
>>>
>>> #include <stdio.h>
>>> #include <unistd.h>
>>> int main(int argc, char **argv) {
>>>   int idx;
>>>   for (idx=0; idx<4; idx++) { printf("argc=%d, %d) hello,
>>> world...\n",argc,idx); fflush(stdout); sleep(1); }
>>> }
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Project Jupyter" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to jupyter+u...@googlegroups.com.
>>> To post to this group, send email to jup...@googlegroups.com.
>>> To view this discussion on the web visit https://groups.google.com/d/ms
>>> gid/jupyter/ffd113b2-d2b9-46e1-99fc-ed17e05423cf%40googlegroups.com
>>> <https://groups.google.com/d/msgid/jupyter/ffd113b2-d2b9-46e1-99fc-ed17e05423cf%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>> --
> You received this message because you are subscribed to the Google Groups
> "Project Jupyter" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to jupyter+unsubscr...@googlegroups.com.
> To post to this group, send email to jupyter@googlegroups.com.
> To view this discussion on the web visit https://groups.google.com/d/
> msgid/jupyter/c0939793-2697-4c1d-8a68-7345c72d875e%40googlegroups.com
> <https://groups.google.com/d/msgid/jupyter/c0939793-2697-4c1d-8a68-7345c72d875e%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups 
"Project Jupyter" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to jupyter+unsubscr...@googlegroups.com.
To post to this group, send email to jupyter@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jupyter/CAOvn4qjgn2eQ0nV6YO_gsm_dF%2BKr7MWy1uF%3D6Z-MkEOHHqixUQ%40mail.gmail.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to