python-重用来自不同IPython笔记本的代码
我正在使用IPython,并且希望从一个笔记本运行另一个笔记本的功能(而不能在不同笔记本之间剪切和粘贴它们)。 这可能并且合理容易做到吗?
10个解决方案
35 votes
使用以下命令启动笔记本服务器:
ipython notebook --script
还将笔记本(2979284184183627072512)保存为Python脚本(.py),您将能够导入它们。
或者看一下:[http://nbviewer.ipython.org/5491090/]包含2个笔记本,一个笔记本执行另一个笔记本。
Matt answered 2020-07-23T15:08:09Z
22 votes
在IPython 2.0中,您可以简单地%run 'my_shared_code.ipynb'在笔记本之间共享代码。 参见例如[http://nbviewer.ipython.org/gist/edrex/9044756。]
Eric Drechsel answered 2020-07-23T15:08:29Z
14 votes
Ipythons .py magic允许您在笔记本中执行python文件和ipython脚本。 有时我会使用.ipy选项,以便它在笔记本命名空间中运行。 执行其中包含c.NotebookManager.save_script=True的单元以获取更多信息。
您可以使用.py将笔记本另存为.ipy文件,以保存或取消注释ipython_notebook_config.py文件中的行c.NotebookManager.save_script=True,以达到相同的效果(使用ipython profile create进行设置-在Ubuntu上,配置文件位于~/.config/ipython/)。
编辑:以下是正确的,但不是必需的-您可以直接.py .ipy文件。 谢谢埃里克。
如果在要导入的笔记本中使用ipython magics,我发现可以将.py文件重命名为.ipy(一个ipython脚本),但是我必须删除第一行(其中包含文件编码声明)才能正常工作 。 可能有更好的方法! 这种方法也可能会混淆细胞魔术(它们将被同时应用)。
drevicko answered 2020-07-23T15:09:04Z
4 votes
还有一个“写入并执行”扩展名,它使您可以将单元格的内容写入文件(并替换旧内容->更新代码),然后可以将其导入另一个笔记本中。
[HTTPS://GitHub.com/民人口/I Python_extensions#write-安定-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")
Jan Katins answered 2020-07-23T15:09:38Z
3 votes
您可以使用qtconsole连接到同一内核。 只需在启动时提供:
ipython qtconsole --existing kernel-0300435c-3d07-4bb6-abda-8952e663ddb7.json
启动笔记本后,查看输出以获取长字符串。
Mike Müller answered 2020-07-23T15:07:40Z
2 votes
是的,您可以“从一个笔记本运行另一个笔记本的功能(无需在不同笔记本之间剪切和粘贴功能)”-是的,这很容易做到!
tl; dr:将代码放在文件系统的python文件(%cat my_code/foo.py)中,并让多个笔记本使用同一代码。 (就是这么简单。)
(为什么当我们有非常好的代码编辑器和IDE可以更好地编写和阅读代码时,为什么要在笔记本中放入那么多的代码?更不用说需要适当的版本控制了!我们试图实现什么,付出多少代价? ?%cat my_code/foo.py)
细节:
将您的代码放入普通的python文件中,例如%cat my_code/foo.py,添加一个(可能为空)my_code/__init__.py
利用代码在适当的版本控制下(例如git)的优势-注意区分ipynb json文件有多困难?
同时将笔记本也置于版本控制之下。 原始git日志将很难阅读,但注释可能会有用。 (GitHub / GitLab显示ipython笔记本,顺便说一句。)
将ipynb笔记本中的py源限制为少量的“驱动程序”代码,输出和文档。
如果要“内联”外部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('{}'.format(
formatter.get_style_defs('.highlight'),
highlight(code, get_lexer_for_filename(filename), formatter)))
您最喜欢的代码编辑器和IDE谢谢您的支持。
michael answered 2020-07-23T15:10:43Z
1 votes
我确实将其他笔记本称为笔记本。 您甚至可以使用以下技巧将“参数”传递给其他笔记本:
将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字典的相关键
volodymyr answered 2020-07-23T15:11:17Z
1 votes
我要在笔记本中使用以下功能,以从源笔记本中加载功能或操作:
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)
Mattijn answered 2020-07-23T15:11:42Z
0 votes
因此,@ MikeMuller的好主意适用于本地笔记本,但不适用于远程笔记本(对吗?)。 我认为没有办法让您远程调用远程服务器上的单个单元块或ipynb代码的功能,并不能以编程方式将结果返回到调用例程中,除非该代码在传达结果方面做得非常出色。
@Matt提交关于以下内容的相同想法时,我正在写作中
io.open(nbfile)
* .pynb是JSON容器,而不是实际的python脚本。 您可以使用以下命令让ipython导出* .py
如果目标* .ipynb位于不受控制的远程计算机上,则可能需要拉出文件,以便可以将输出写入本地路径。 (没有研究是否可以在远程资源上调用它以创建本地输出。)创建该输出后,您应该能够导入并运行* .py或其中的单个函数。
关于@Matt的问题,有关使用io.open(nbfile)批发运行另一个* .ipynb文件的简洁示例,nbfile是否可以是远程的? 似乎很远,但是会很棒...
Roland answered 2020-07-23T15:12:21Z
0 votes
以下是另外两个提示:
您还可以直接从笔记本计算机运行%qtconsole magic,它会自动连接到笔记本内核。
查看[https://github.com/atiasnir/ipnb]
您可以使用它来导入笔记本文件,就像它们是标准python模块一样(我是作者:-))。 这里的主要限制是它将丢弃魔术单元(因为它根本不使用IPython),但否则应该可以正常工作。
atiasnir answered 2020-07-23T15:12:54Z