在jupyter笔记本中使用%run而不影响交互命名空间

时间:2018-02-13 13:01:52

标签: python jupyter-notebook

我正在尝试在jupyter笔记本中运行python脚本,而脚本调用后脚本中的变量不会传递到我的交互式命名空间。

以下示例:

myscript.py:

var1 = 10

我的笔记本:

var1 = 9
%run myscript.py
print(var1)

我希望打印的答案为9而不是10.我还尝试按documentation中的说明运行%run -p myscript.py,但似乎得到了相同的结果。

3 个答案:

答案 0 :(得分:0)

您没有从脚本返回任何内容或重置var1的值。 This答案应该有所帮助。您需要在myscript.py中编写一个返回所需值的函数,然后将其设置为var1

myscript.py

def this_awesome_function():
    return 10

笔记本:

from myscript import this_awesome_function

var1 = this_awesome_function()
print(var1) 

希望这应该有效!

答案 1 :(得分:0)

我的一位同事给出了以下答案,这是迄今为止我发现的最好的答案:

import subprocess

var1 = 9
subprocess.Popen(["python3", "myscript.py"])
print(var1)

我不确定jupyter笔记本允许你这样做。最有可能使用%run%prun,但无法弄明白。

答案 2 :(得分:0)

目前没有 %run(见底部);但是,您不需要从笔记本内部运行 bash 脚本或调用 subprocess。您可以使用以下命令将命令发送到单独的 shell 实例并运行脚本,而不会影响您的本地命名空间:

!python myscript.py

有关详细信息,请参阅“IPython 中的 Shell 命令”here 和下面的部分。 Jupyter Python 笔记本建立在 IPython 能力之上。


正如我所建议的 here,通常您需要 Jupyter 中功能更齐全的 %run,因为它处理回传错误、input 提示,并将脚本的输出更好地连接到一般的 Jupyter 笔记本。

因此,您按照最佳实践的思路思考得很好;但是,您与笔记本中的变量重叠,您希望避免的脚本主要部分可以使用 !python myscript.py 轻松完成。通常,您的 main 命名空间中实际上不会有太多内容,因为您更多地使用函数对脚本进行模块化。


我看到文字 here 让您认为 -p 选项应该按照您的想法执行:

<块引用>

在这种模式下,程序的变量不会传播回 IPython 交互式命名空间(因为它们保留在分析器执行它们的命名空间中)。

它似乎确实描述了您在说什么,而我无法解释为什么它没有。我什至尝试过当前的 IPython 并且发生了同样的事情。