<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 30 October 2017 at 20:35, Erik Bray <span dir="ltr"><<a href="mailto:erik.m.bray@gmail.com" target="_blank">erik.m.bray@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">I should add--another case that is becoming extremely common is<br>
beginners learning Python for the first time inside the<br>
Jupyter/IPython Notebook.  And in my experience it can be very<br>
difficult for beginners to understand the connection between what's<br>
happening in the notebook ("it's in the web-browser--what does that<br>
have to do with anything on my computer??") and the underlying Python<br>
interpreter, file system, etc.  Being able to pip install from within<br>
the Notebook would be a big win.  This is already possible since<br>
IPython allows running system commands and it is possible to run the<br>
pip executable from the notebook, then manually restart the Jupyter<br>
kernel.<br>
<br>
It's not 100% clear to me how my proposal below would work within a<br>
Jupyter Notebook, so that would also be an angle worth looking into.<br></blockquote><div><br></div>A few specific notes here:</div><div class="gmail_quote"><br></div><div class="gmail_quote">1. As you say, this sort of already works in notebooks, since instructors can say to run "!pip install requests" and then restart the language kernel.</div><div class="gmail_quote"><div class="gmail_quote">2. We could probably replicate that style in IDLE, 
since that runs user code in a subprocess, similar to the way Jupyter 
language kernels are separate from the frontend client</div>3. We can't replicate it as readily in the regular REPL, since that runs Python code directly in the current process, but even there I believe we could potentially trigger a full process restart via execve (or the C++ style _execve on Windows)</div><br><div class="gmail_quote">(We'd want a real process restart, rather than emulating it by calling Py_Initialize & Py_Finalize multiple times, as not every module properly supports multiple initialise/finalise cycles within a single process, and module-specific quirks are exactly what we'd be trying to avoid by forcing an interpreter restart)<br></div><div class="gmail_quote"><br></div><div class="gmail_quote">So the main missing piece if we went down that path would be to offer a way to say from within the interpreter itself "Restart the current interactive session". One possible approach to that would be to define a RestartInterpreter subclass of SystemExit, which the interpreter would intercept at around the same point where it checks for the PYTHONINSPECT flag, and then initiate a graceful process shutdown and restart, rather than a normal exit. We'd probably want that capability to be off by default and enable it explicitly from the CPython CLI though, as otherwise it could have some really annoying side effects in runtime embedding use cases.</div><div class="gmail_quote"><br></div><div class="gmail_quote">I'm sure there'd be some thorny edge cases that would arise in trying to make this work in practice, but at first glance, the general idea sounds potentially feasible to me.<br></div><div class="gmail_quote"></div><div class="gmail_quote"><br></div><div class="gmail_quote">Cheers,</div><div class="gmail_quote">Nick.<br></div><br>-- <br><div class="gmail_signature">Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>   |   Brisbane, Australia</div>
</div></div>