默认情况下在Jupyter笔记本中配置第一个单元格

时间:2016-03-24 07:09:10

标签: python jupyter jupyter-notebook

TI有没有办法在Jupyter笔记本中为特定的python内核配置默认的第一个单元格?我同意默认的python导入违反了良好的编码习惯。

所以,我可以配置笔记本,以便新的python笔记本的第一个单元始终是

import numpy as np
例如

6 个答案:

答案 0 :(得分:4)

如上所述创建一个IPython配置文件是一个很好的第一个解决方案,但IMO并不完全令人满意,特别是在代码共享时。

通过命令exec_lines导入的库的名称不会出现在笔记本中,因此您可以轻松忘记它。在另一个配置文件/机器上运行代码会引发错误。

因此我建议使用Jupyter笔记本扩展,因为会显示导入的库。 它可以避免在笔记本电脑的开头导入相同的库。 首先,您需要安装Jupyter的nbextension。 你可以克隆回购:https://github.com/ipython-contrib/jupyter_contrib_nbextensions 或使用点子:pip install jupyter_contrib_nbextensions

然后,您可以通过添加文件夹' default_cells'来创建nb扩展名。到安装nb扩展的路径。例如在Ubuntu上的/ usr / local / share / jupyter / nbextensions /。,也许在Windows上:C:\ Users \ xxx.xxx \ AppData \ Roaming \ jupyter \ nbextensions \

您必须在此文件夹中创建3个文件:

  • main.js,其中包含扩展名
  • 的js代码
  • Jupyter中API的default_cells.yaml说明
  • README.MD API中出现的读者的通常描述。

我使用了以下代码:https://github.com/jupyter/notebook/issues/1451my main.js是:

define([
    'base/js/namespace'
], function(
    Jupyter
) {
    function load_ipython_extension() {
      if (Jupyter.notebook.get_cells().length===1){
   //do your thing
        Jupyter.notebook.insert_cell_above('code', 0).set_text("# Scientific libraries\nimport numpy as np\nimport scipy\n\n# import Pandas\n\nimport pandas as pd\n\n# Graphic libraries\n\nimport matplotlib as plt\n%matplotlib inline\nimport seaborn as sns\nfrom plotly.offline import init_notebook_mode, iplot, download_plotlyjs\ninit_notebook_mode()\nimport plotly.graph_objs as go\n\n# Extra options \n\npd.options.display.max_rows = 10\npd.set_option('max_columns', 50)\nsns.set(style='ticks', context='talk')\n\n# Creating alias for magic commands\n%alias_magic t time");
      }
    }
    return {
        load_ipython_extension: load_ipython_extension
    };
});

.yaml必须格式化为:

Type: IPython Notebook Extension
Compatibility: 3.x, 4.x
Name: Default cells
Main: main.js
Link: README.md
Description: |
  Add a default cell for each new notebook. Useful when you import always the same libraries$


Parameters:
- none

和README.md

default_cells
=========

Add default cells to each new notebook. You have to modify this line in the main.js file to change your default cell. For example

`Jupyter.notebook.insert_cell_above('code', 0).set_text("import numpy as np/nimportpandas as pd")`


You can also add another default cell by creating a new line just below :

`Jupyter.notebook.insert_cell_above('code', 1).set_text("from sklearn.meatrics import mean_squared_error")`

**Don't forget to increment 1 if you want more than one extra cell. **

然后你只需要启用“默认”单元格'新标签中的扩展程序&nbextensions'出现在Jupyter。

唯一的问题是它通过查看笔记本中的单元格数来检测笔记本是否是新的。但如果您在一个单元格中编写了所有代码,它会将其检测为新笔记本并仍添加默认单元格。

答案 1 :(得分:4)

另一个半解决方案:将默认代码保留在文件中,并在第一个单元格中手动键入并执行%load命令。

我将标准导入保留在firstcell.py中:

%reload_ext autoreload
%autoreload 2

import numpy as np
import pandas as pd
... 

然后在每个新笔记本中,我在第一个单元格中键入并运行%load firstcell.py,jupyter将第一个单元格内容更改为

# %load firstcell.py
%reload_ext autoreload
%autoreload 2

import numpy as np
import pandas as pd

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline

如果你真的只想要一个导入语句,这对你没有任何帮助,但是如果你有几个你总是想要使用,这可能会有所帮助。

答案 2 :(得分:1)

一个快速且灵活的解决方案是创建模板笔记本,例如 一台带有特定 Python 2.7 内核导入的笔记本:

<块引用>

a_template_for_python27.ipynb

另一个具有不同导入的笔记本:

<块引用>

a_template_for_python36.ipynb

前面的 a_ 的优点是您的笔记本显示在顶部。

现在您可以在需要时复制笔记本。与 %load firstcell.py 相比的优势在于您不需要其他文件。

然而,这种方法的问题在于,当您想使用另一个内核启动现有笔记本时,导入不会动态更改。

答案 3 :(得分:0)

去那里:

~/.ipython/profile_default/startup/

您可以阅读自述文件:

  

这是IPython启动目录

     此目录中的

.py和.ipy文件将之前运行到任何代码   或通过exec_lines或exec_files配置指定的文件   无论何时加载此个人资料。

     

文件将按字典顺序运行,因此您可以控制   具有前缀的文件的执行顺序,例如::

00-first.py
50-middle.py
99-last.ipy

所以你只需要在00_imports.py创建一个包含以下内容的文件:

import numpy as np

如果您想添加%matplotlib inline使用.ipy这样的内容,您也可以直接使用{

>。

或者,似乎存在另一个notebook extension解决方案,但我不知道它是如何工作的,请参阅此处了解该主题的github问题: https://github.com/jupyter/notebook/issues/640

HTH

答案 4 :(得分:0)

我觉得很方便的另一种方法是在笔记本中使用%load命令。

作为示例,我将以下一行代码存储到python文件__JN_init.py

import numpy as np

然后,只要需要,您就可以输入:

%load __JN_init.py

并运行单元格。您将获得预期的要加载的软件包。优点是您可以保留一组常用的初始化代码,而几乎没有时间进行设置。

答案 5 :(得分:0)

我想到了这个

1-创建一个启动脚本,该脚本将检查.jupyternotebookrc文件:

# ~/.ipython/profile_default/startup/run_jupyternotebookrc.py

import os
import sys

if 'ipykernel' in sys.modules: # hackish way to check whether it's running a notebook
    path = os.getcwd()
    while path != "/" and ".jupyternotebookrc" not in os.listdir(path):
        path = os.path.abspath(path + "/../")
    full_path = os.path.join(path, ".jupyternotebookrc")
    if os.path.exists(full_path):
        get_ipython().run_cell(open(full_path).read(), store_history=False)

2-使用您要运行的代码在项目中创建一个配置文件:

# .jupyternotebookrc in any folder or parent folder of the notebook

%load_ext autoreload
%autoreload 2
%matplotlib inline

import numpy as np

您可以提交.jupyternotebookrc并与其他人共享,但是他们还需要检查该脚本的启动脚本。