48

我正在使用 IPython 并希望从另一个笔记本运行功能(无需在不同的笔记本之间剪切和粘贴它们)。这可能并且相当容易做到吗?

4

10 回答 10

35

使用以下命令启动笔记本服务器:

ipython notebook --script

还将笔记本 ( .ipynb) 保存为 Python 脚本 ( .py),您将能够导入它们。

或者看看: http: //nbviewer.ipython.org/5491090/包含 2 个笔记本,一个执行另一个。

于 2013-06-06T16:00:36.460 回答
24

在 IPython 2.0 中,您可以简单地%run 'my_shared_code.ipynb'在笔记本之间共享代码。参见例如http://nbviewer.ipython.org/gist/edrex/9044756

于 2014-02-17T21:30:08.263 回答
14

ipythons%run魔术允许您在笔记本中执行 python 文件和 ipython 脚本。我有时会使用该-i选项,以便它在笔记本命名空间中运行。执行其中包含的单元格以%run?获取更多信息。

您可以使用ipython --script将笔记本也保存为.py每次保存时的文件或取消注释文件中的行c.NotebookManager.save_script=Trueipython_notebook_config.py获得相同的效果(ipython profile create用于设置 - 在 Ubuntu 上,配置文件位于其中~/.config/ipython/)。

编辑:以下是正确的,但没有必要 - 您可以直接%run创建.ipynb文件。谢谢埃里克

如果您在要导入的笔记本中使用 ipython 魔法,我发现您可以将.py文件重命名为.ipy(一个 ipython 脚本),但我必须删除第一行(其中包含文件编码声明)才能使其工作。可能有更好的方法!这种方法也可能会混淆细胞魔法(它们都会立即应用)。

于 2013-08-14T01:01:18.033 回答
4

还有一个“写入和执行”扩展,它可以让您将单元格的内容写入文件(并替换旧内容 -> 更新代码),然后可以将其导入另一个笔记本中。

https://github.com/minrk/ipython_extensions#write-and-execute

在一个笔记本中(两个单元格)

%reload_ext writeandexecute
--
%%writeandexecute -i some_unique_string functions.py
def do_something(txt):
    print(txt)

然后在另一个笔记本中:

from functions import do_something
do_something("hello world")
于 2015-07-02T14:20:40.563 回答
3

您可以使用 qtconsole 连接到同一个内核。只需在启动时提供:

ipython qtconsole --existing kernel-0300435c-3d07-4bb6-abda-8952e663ddb7.json

为长字符串启动笔记本后查看输出。

于 2013-06-06T15:56:20.080 回答
1

我确实从其他笔记本中调用笔记本。您甚至可以使用以下技巧将“参数”传递给其他笔记本:

params字典放在“report_template.ipynb”的第一个单元格中。

params = dict(platform='iOS', 
              start_date='2016-05-01', 
              retention=7)
df = get_data(params ..)
do_analysis(params ..)

在另一个(更高逻辑级别)笔记本中,使用此函数执行它:

def run_notebook(nbfile, **kwargs):
    """
    example:
    run_notebook('report.ipynb', platform='google_play', start_date='2016-06-10')
    """

    def read_notebook(nbfile):
        if not nbfile.endswith('.ipynb'):
            nbfile += '.ipynb'

        with io.open(nbfile) as f:
            nb = nbformat.read(f, as_version=4)
        return nb

    ip = get_ipython()
    gl = ip.ns_table['user_global']
    gl['params'] = None
    arguments_in_original_state = True

    for cell in read_notebook(nbfile).cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

        if arguments_in_original_state and type(gl['params']) == dict:
            gl['params'].update(kwargs)
            arguments_in_original_state = False

run_notebook("report_template.ipynb", start_date='2016-09-01')

此命令将执行“report_template”笔记本的每个单元格,并将覆盖从第二个单元格开始的params字典的相关键

于 2016-09-29T08:54:02.670 回答
1

是的,您可以“从一个笔记本运行另一个笔记本的功能(无需在不同的笔记本之间剪切和粘贴它们)” ——而且,是的,这很容易做到!

tl;dr:将代码放在*.py文件系统中的 python 文件()中,让多个笔记本使用相同的代码。(就这么简单。)

(当我们有非常好的代码编辑器和 IDE 来编写和阅读代码时,为什么要在笔记本中放这么多代码?更不用说需要适当的版本控制了!我们想要实现什么,以及花费多少? </rant>)

细节:

  • 将您的代码放在普通的 python 文件中,例如my_code/foo.py,添加一个(可能是空的)my_code/__init__.py
  • 充分利用在适当的版本控制下的代码(例如 git)——注意区分 ipynb json 文件有多难?
  • 还将笔记本也置于版本控制之下。原始的 git 日志很难阅读,但注释可能很有用。(GitHub/GitLab 显示 ipython 笔记本,顺便说一句。)
  • 将 ipynb 笔记本中的 py 源限制为少量的“驱动程序”代码、输出和文档。
  • 另见:https ://ipython.org/ipython-doc/stable/config/extensions/autoreload.html
  • 如果你想“内联”外部 python 文件,只需使用(例如)魔法%cat my_code/foo.py......

...如果您想要更有趣的东西来显示该源内联(可选,将以下内容添加到外部,可重用的源文件)...

import IPython
from pygments import highlight
from pygments.formatters import HtmlFormatter
from pygments.lexers import get_lexer_for_filename

filename='my_code/foo.py'
with open(filename) as f: code = f.read()
formatter = HtmlFormatter(linenos='inline')
IPython.display.HTML('<style type="text/css">{}</style>{}'.format(
                formatter.get_style_defs('.highlight'),
                highlight(code, get_lexer_for_filename(filename), formatter)))

您最喜欢的代码编辑器和 IDE 感谢您的支持。

于 2017-08-04T10:21:44.280 回答
1

我在要从源笔记本加载函数或操作的笔记本中使用以下函数:

import io
import nbformat

def execute_notebook(nbfile):
    with io.open(nbfile, encoding="utf8") as f:
        nb = nbformat.read(f, as_version=4)

    ip = get_ipython()

    for cell in nb.cells:
        if cell.cell_type != 'code':
            continue
        ip.run_cell(cell.source)

像这样使用:

execute_notebook(path/to/notebook.ipynb)
于 2017-12-29T08:51:56.957 回答
0

所以@MikeMuller 的好主意适用于本地笔记本,但不适用于远程笔记本(对吗?)。我认为没有一种方法可以让您远程调用远程服务器上的单个单元块或 ipynb 代码的函数,并能够以编程方式将结果返回到您的调用例程中,除非该代码在传达结果方面做了一些相当非凡的事情。

当@Matt 提交相同的想法时,我正在写作

ipython <URI_to_Notebook> --script

*.pynb 是一个 JSON 容器,而不是一个实际的 python 脚本。您可以使用 ipython 导出 *.py

如果目标 *.ipynb 位于您无法控制的远程计算机上,您可能需要拉取文件以便将输出写入本地路径。(尚未研究是否可以在远程资源上调用它来创建本地输出。)一旦创建,您应该能够导入和运行 *.py 或其中的单个函数。

@Matt 关于运行另一个 *.ipynb 文件批发的简洁示例的一个问题是,nbfileio.open(nbfile)是否可以是远程的?似乎是一个很长的镜头,但会很棒......

于 2013-06-06T16:08:26.487 回答
0

这里有两个额外的提示:

  1. 你也可以%qtconsole直接从 notebook 运行 magic,它会自动连接到 notebook 内核。

  2. 查看https://github.com/atiasnir/ipnb

    您可以使用它来导入笔记本文件,就好像它们是标准的 Python 模块一样(我是作者 :-))。这里的主要限制是它会丢弃魔法单元(因为它根本不使用 IPython),否则它应该可以正常工作。

于 2014-07-08T08:15:58.547 回答