我正在尝试在jupyter笔记本中运行python脚本,而脚本调用后脚本中的变量不会传递到我的交互式命名空间。
以下示例:
myscript.py:
var1 = 10
我的笔记本:
var1 = 9
%run myscript.py
print(var1)
我希望打印的答案为9而不是10.我还尝试按documentation中的说明运行%run -p myscript.py
,但似乎得到了相同的结果。
答案 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 并且发生了同样的事情。