码python用什么笔记本_python-重用来自不同IPython笔记本的代码

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

你可能感兴趣的:(码python用什么笔记本)