重用来自不同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是否可以是远程的? 看起来像一个远投,但将是伟大的…
这里有两个额外的提示:
-
您也可以直接从笔记本运行
%qtconsole
魔术,它会自动连接到笔记本内核。 -
看看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感谢您的支持。