Can Jupyter run a separate R notebook from within a Python notebook?

后端 未结 2 1212
攒了一身酷
攒了一身酷 2021-01-19 01:48

I have a Jupyter notebook (python3) which is a batch job -- it runs three separate python3 notebooks using %run. I want to invoke a fourth Jupyter R-kernel note

2条回答
  •  野趣味
    野趣味 (楼主)
    2021-01-19 01:59

    I don't think you can use the %run magic command that way as it executes the file in the current kernel.

    Nbconvert has an execution API that allows you to execute notebooks. So you could create a shell script that executes all your notebooks like so:

    #!/bin/bash
    jupyter nbconvert --to notebook --execute 1_py3.ipynb
    jupyter nbconvert --to notebook --execute 2_py3.ipynb
    jupyter nbconvert --to notebook --execute 3_py3.ipynb
    jupyter nbconvert --to notebook --execute 4_R.ipynb
    

    Since your notebooks require no shared state this should be fine. Alternatively, if you really wanna do it in a notebook, you use the execute Python API to call nbconvert from your notebook.

    import nbformat
    from nbconvert.preprocessors import ExecutePreprocessor
    
    with open("1_py3.ipynb") as f1, open("2_py3.ipynb") as f2, open("3_py3.ipynb") as f3, open("4_R.ipynb") as f4:
        nb1 = nbformat.read(f1, as_version=4)
        nb2 = nbformat.read(f2, as_version=4)
        nb3 = nbformat.read(f3, as_version=4)
        nb4 = nbformat.read(f4, as_version=4)
    
    ep_python = ExecutePreprocessor(timeout=600, kernel_name='python3')
    #Use jupyter kernelspec list to find out what the kernel is called on your system
    ep_R = ExecutePreprocessor(timeout=600, kernel_name='ir')
    
    # path specifies which folder to execute the notebooks in, so set it to the one that you need so your file path references are correct
    ep_python.preprocess(nb1, {'metadata': {'path': 'notebooks/'}})
    ep_python.preprocess(nb2, {'metadata': {'path': 'notebooks/'}})
    ep_python.preprocess(nb3, {'metadata': {'path': 'notebooks/'}})
    ep_R.preprocess(nb4, {'metadata': {'path': 'notebooks/'}})
    
    with open("1_py3.ipynb", "wt") as f1, open("2_py3.ipynb", "wt") as f2, open("3_py3.ipynb", "wt") as f3, open("4_R.ipynb", "wt") as f4:
        nbformat.write(nb1, f1)
        nbformat.write(nb2, f2)
        nbformat.write(nb3, f3)
        nbformat.write(nb4, f4)
    

    Note that this is pretty much just the example copied from the nbconvert execute API docs: link

提交回复
热议问题