Execute Highlighted Code in Jupyter notebook Cell? - python

Is it possible to execute ONLY the highlighted code in a Jupyter notebook cell? This is possible in Spyder and RStudio.
I find this to be quite useful for trouble-shooting code as you write.
If a cell contains:
a=13
b=17
c=42
a=a*c
I'd like to be able to highlight and run only the desired lines (e.g. variable assignmemnts), but not the final line.
I use this frequently in Spyder and RStudio, would love to do in Jupyter as well. I find I am constantly splitting and re-combining cells in order to troubleshoot a single line of code, where for example, I've indexed into something incorrectly. Highlighting and printing the variable allows me to see what I've actually assigned it to be and is throwing an error, vs. what I had intended.

There is no such thing in Jupyter as 'highligh and run'. At least I am not aware of it.
Run the cell after commenting the other lines out using CTRL + /, split cells and execute only the chosen ones or use a debugger (e.g. pudb, it works in Jupyter) to change variables values on the fly (while debugging).

It seems now it is available in python notebook as well.
https://github.com/jupyterlab/jupyterlab/pull/2191
If I open a python notebook in Kaggle (www.kaggle.com) and select a text, it lets me run only the highlighted part.

Related

Jupyter notebook - option to prevent re-execution of a cell?

I want to know if there is an option in the Notebook UI or some magic command (for a cell) that prevents its re-execution.
For e.g., if I execute a few cells in sequence, and wanted to go back to re-run the first cell, then I should be prevented from doing that.
For the old Jupyter notebook see: How to freeze a cell alone with its outputs on a jupyter notebook.
For JupyterLab there is no extension yet but there is an agreement that this is a good idea. Everyone can become an extension author and contribute it. A good starting point is the Extension Developer guide.
If the cell has no output that you care about you can use a handy trick of temporarily switching its type to "raw" (as raw cells don't get executed). It can be done with a keyboard sequence of Esc, r; then to restore its type to "code" cell you can use Esc, y.

Starting second Jupyter notebook where first left off

Context:
I started teaching myself a few new libraries using Jupyter Lab. I know showing emotion on SO is strictly forbidden and this will get edited, but WOW, Jupyter notebooks are cool!
Anyway, I'm taking notes in markdown as I work through code examples. It gave me the idea of writing my own little textbook as I learn.
For example, in notebook 1, I talk about (teach myself) linear regression. It take notes on vocabulary, show some mathy formulas then work through some code examples. End section.
In notebook 2, I start the conversation about different metrics to show how effective the regression model was. Then I want to execute some code to calculate those metrics... but all the code for the regression model is in the last notebook and I can't access it.
Question:
Is there a way to link these two notebooks together so that I don't have to re-write the code from the first one?
My attempt:
It seems like the closest thing to what I want to do is to use
%run notebook_01.ipynb
However, this throws an error. Note that it appears to search for a .py file to run:
ERROR:root:File 'linear_regression01.ipynb.py' not found.
I have found some questions/answers where this appears to work for other users, but it is not for me.
Edit: I got the magic command %run to work, however it runs AND prints the entire first notebook into the second. I'ts good to know how to do this and it does achieve the goal of not having to re-code, but it re-prints absolutely everything, which I do not want.
If you run this from the command line :
jupyter nbconvert --to script first_notebook.iynb
It will create a python file from your first notebook called 'first_notebook.py'. After that you can import from that file into your second notebook with:
import first_notebook
Ok, I found the answer by way of suppressing outputs:
Just put this at the top of your second notebook:
from IPython.utils import io
with io.capture_output() as captured:
%run your_linked_notebook.ipynb
This will cause the notebook you want to link to run, allowing you to use any of the data from it, but without having to see all of the outputs and visualizations from it.
This is probably not a great way to go if you are working with a lot of data or linking a lot of notebooks that perform expensive computations, but will likely do the trick for most people.
If there is an answer that does not involve running the notebook linked, I'd be excited to see it.

Python Jupyter Notebook: Specify cell execution order

I have a Jupyter notebook.
In the cell 1, I defined a lot of functions, which need to run before other things. Then in the following cells, I start to present result.
However, when I convert to HTML, this layout is ugly. Readers have to scroll a long time to see the result and they may not care about the functions at all.
But I have to put the code in that order because I need those functions.
So my question is, is there a way I could control the run order of cells after I click run all? or is there a way I could do something like the following.
I put all my function definitions in cell 20, then in cell 1, I could say tell Jupyter something like "run cell 20".
Just curious if this is doable.
Thanks.
I would save the functions as a separate module, then import this module at the beginning.
Such a functionality, (to my knowledge) is not available in Jupyter as of yet. However, if you are really worried about having a lot of function definitions at the beginning and want to hide them, you can do the following alternative:
Define the functions in a Python script.
Add the script execution to the first coding cell of your notebook
Add the remaining of the code to the consecutive cells of the notebook
Optionally, show its contents at the end of the notebook for viewers' convenience.
Check out the execution_dependencies nbextension. With that, you can define dependencies on the order of the execution of your cells.
To use tags on your cells:
View - Cell Toolbar - Tags
E.g.:
Add tags to your cells
Cell 1 - #HTML, =>functions
print(txt)
...
Cell 20 - #functions
txt = 'functions'
When you run Cell 1 it will output 'functions' because it will run cell 20 first.
Consider using the Runtools nbextension, which allows you to run selected cells.

Jupyter get arbitrary notebook cell contents

I would like to access the textual contents of another cell in the notebook from Python so that I can feed it to the unit testing script, regardless of whether it has been executed or not. It seems like this should be possible, but I can't find the right API to do it in the IPython kernel. Thoughts?
This question asks the same question, but I don't really want to use magics unless I have to. Ideally the workflow would be "select widget choice" followed by "click widget" to cause the tests to run.
Background
I'm working with some students to teach them Python, and in the past when I've done this I've set up a bunch of unit tests and then provided instructions on how to run the tests via a shell script. However, I'm working with some students that don't have access to computers at home, so I decided to try and use an Jupyter notebook environment (via mybinder.org) to allow them to do the same thing. I've got most of it working already via some ipywidgets and a helper script that runs the unit tests on some arbitrary set of code.
As far as the cells that have been run, the input and output caching system described at https://ipython.readthedocs.io/en/stable/interactive/reference.html#input-caching-system might be useful. (Examples of its use at https://stackoverflow.com/a/27952661/8508004 ). It works in Jupyter notebooks as shown below. (The corresponding notebook can be viewed/accessed here.)
Because #A. Donda raised the issue of markdown in the comments below, I'll add here that nbformat provides related abilities that works with saved notebook files. Reading a saved notebook file with nbformat allowa getting cells and content, no matter if it is code or markdown, and sorting whether the cells are markdown or code, etc.. I have posted a number of examples of using nbformat on the Jupyter Discourse forum that can be seen listed via this search here. It offers more utility than the related json.load(open('test.ipynb','r')) command, highlighted in a comment here to read a notebook file because of the additional notebook context automatically included.
If you want to capture the contents of a specific cell to access it from another one, one workaround seems to bee to write the contents of the first cell to file when executing it and later loading the resulting file (i.e. the text giving the former cell's content) inside the latter cell, where the content of the former cell is required.
Cell's contents can be saved to file (when executing the respective cell) via the command
%%writefile foo.py
which has to be placed at the beginning of a cell. This results in the cell's content (in which the upper command is executed) being saved to the file foo.py and it's just a matter of later reading it in, again.
The output of a cell can be made available more easily:
Just place %%capture output in the first line of a cell. Then, the output of the cell (after execution) is going to be saved as a string to the variable output and can be used like any standard python string-variable.
References:
Programmatically get current Ipython notebook cell output? and
https://nbviewer.jupyter.org/github/ipython/ipython/blob/1.x/examples/notebooks/Cell%20Magics.ipynb
I found a solution to this that can get the output of any cell. It requires running some Javascript.
Here is the code that you can put in a cell and run it an it will generate a Python variable called cell_outputs which will be an array of the cell outputs in the same order as they appear on the page. The output of the cell executing this code, will have an empty string.
%%js
{
let outputs=[...document.querySelectorAll(".cell")].map(
cell=> {
let output=cell.querySelector(".output_text")
if(output) return output.innerText
output=cell.querySelector(".rendered_html")
if(output) return output.innerHTML
return ""
}
)
IPython.notebook.kernel.execute("cell_outputs="+JSON.stringify(outputs))
}
If you need the output of a specific cell, just use its index, eg: cell_outputs[2] in your Python code to access the output of cell #3.
I tested this on my Jupyter notebook 6.0.3 (recent install via the Anaconda community edition) on Google Chrome. The above could should work fine on any modern browser (Chrome, Firefox or Edge).

Apache Zeppelin - modify default syntax highlight

I am using Zeppelin (ver. 0.6.0.) along with Spark (ver. 1.6.1.) and Hadoop (ver. 2.6.).
Zeppelin gives users option to use several interpreters, but I decided to exclusively use Python.
I managed to set my default interpreter to org.apache.zeppelin.spark.PySparkInterpreter. By creating zeppelin-site.xml file from template; and putting PySparkInterpreter in front of org.apache.zeppelin.spark.SparkInterpreter inside zeppelin.interpreters property tag.
So far everything works correctly. I don't have to insert %pyspark at top of every cell in order write Python code.
Problem:
Syntax highlight of code which is used is for Scala.
In order to have Python syntax highlight I have to do:
Empty content of cell (copy it)
Insert only %pyspark and press SHIFT + ENTER
Wait for error to occur and paste code back into cell.
Question:
Where can I modify default syntax highlight for Zeppelin notebook and set it to use Python one?
Kind regards!
It's most likely will be possible once
https://issues.apache.org/jira/browse/ZEPPELIN-139
is resolved.

Categories