重用来自不同IPython笔记本的代码

我正在使用IPython,并希望从另一个笔记本运行function(不切割和粘贴在不同的笔记本之间)。 这是可能的和合理的容易吗?

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

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

查看长string启动笔记本后的输出。

启动您的笔记本服务器:

 ipython notebook --script 

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

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

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

Ipythons %run magic允许您在笔记本中执行python文件和ipython脚本。 我有时使用-i选项,以便在笔记本名称空间中运行。 用%run?一个单元格%run? 在它的更多信息。

您可以使用ipython --script将笔记本保存为每个保存的.py文件或取消注释行c.NotebookManager.save_script=True在您的ipython_notebook_config.py文件中具有相同的效果(使用ipython profile create来设置up -在Ubuntu上,configuration文件位于~/.config/ipython/ )。

编辑:以下是真实的,但不必要的 – 你可以%run直接%run一个.ipynb文件。 谢谢Eric 。

如果你在要导入的笔记本上使用ipython magics,我发现你可以将.py文件重命名为.ipy (一个ipython脚本),但是我必须删除第一行(包含文件编码声明)上class。 可能有更好的办法! 这种方法可能会混淆细胞魔法(他们都会立刻得到应用)。

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

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") 

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

参数字典放在 “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字典的相关键

所以@ MikeMuller的好主意可以用于本地笔记本,但不是远程的(对吧?)。 我不认为有一种方法可以远程调用远程服务器上的单个单元块或ipynb代码的function,并且能够以编程方式将结果返回到调用例程中,除非该代码执行的结果相当不寻常。

@Matt提交了同样的想法时,我正在写作

ipython <URI_to_Notebook> --script

* .pynb是一个JSON容器,而不是一个实际的Python脚本。 你可以得到ipython导出一个* .py与

如果目标* .ipynb位于不受控制的远程机器上,则可能需要将文件拉出来,以便将输出写入本地path。 (还没有研究过是否可以在远程资源上调用它来创build一个本地输出。)一旦创build完成,您应该能够导入并运行* .py或其中的单个函数。

在@Matt上运行另一个* .ipynb文件与io.open(nbfile)批发的问题的一个问题是nbfile是否可以是远程的? 看起来像一个远投,但将是伟大的…

这里有两个额外的提示:

  1. 您也可以直接从笔记本运行%qtconsole魔术,它会自动连接到笔记本内核。

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

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

是的,你可以“从另一个笔记本上运行function(不需要在不同的笔记本之间剪切和粘贴)” – 是的,这很容易做到!

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

(为什么在笔记本电脑上放这么多代码,当我们有完美的代码编辑器和IDE,这些代码编辑器和IDE更适合编写和阅读代码呢?更不用说需要正确的版本控制了!我们试图达到什么目的,以什么为代价? </rant>

细节:

  • 把你的代码放到普通的python文件中,例如my_code/foo.py ,添加一个(可能是空的) my_code/__init__.py
  • 利用在适当的版本控制下的代码(例如git) – 注意如何分辨ipynb json文件是多么的困难?
  • 也把版本控制下的笔记本电脑。 原始的git日志将很难阅读,但评论可以是有用的。 (GitHub / GitLab显示ipython笔记本,顺便说一句)。
  • 将ipynb笔记本中的py源限制为less量的“驱动程序”代码,输出和文档。
  • 如果你想“内联”外部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感谢您的支持。