簡體   English   中英

在 jupyter notebook 中使用 %run 而不影響交互式命名空間

[英]Using %run in jupyter notebook without affecting interactive namespace

我正在嘗試在 jupyter notebook 中運行 python 腳本,而腳本中的變量在腳本被調用后沒有傳遞到我的交互式命名空間。

下面是一個例子:

我的腳本.py:

var1 = 10

我的筆記本:

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

我希望打印的答案是 9 而不是 10。我也嘗試過按照文檔中的說明運行%run -p myscript.py但似乎得到了相同的結果。

您不會從腳本返回任何內容或重置 var1 的值。 這個答案應該會有所幫助。 您需要在myscript.py中編寫一個返回所需值的函數,然后將其設置為var1

腳本文件

def this_awesome_function():
    return 10

筆記本:

from myscript import this_awesome_function

var1 = this_awesome_function()
print(var1) 

希望這應該有效!

我的一位同事給出了以下答案,這是迄今為止我找到的最好的答案:

import subprocess

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

我不確定 jupyter notebook 是否允許您執行此操作。 它很可能使用%run%prun但無法弄清楚。

目前不使用%run (見底部); 但是,您不需要從筆記本內部運行 bash 腳本或調用subprocess 您可以使用以下命令將命令發送到單獨的 shell 實例並運行腳本,而不會影響您的本地命名空間:

!python myscript.py

有關更多信息,請參閱此處的“IPython 中的 Shell 命令”和下面的部分。 Jupyter Python 筆記本建立在 IPython 能力之上。


正如我在這里建議的那樣,通常您希望在 Jupyter 中使用功能更全面的%run ,因為它可以處理回傳錯誤、 input提示,並將腳本的輸出更好地連接到一般的 Jupyter 筆記本。

所以你沿着最佳實踐的路線思考得很好; 但是,您與筆記本中的變量重疊,您希望避免的腳本的主要部分可以使用!python myscript.py輕松完成。 通常,當您使用函數更多地模塊化腳本時, main命名空間中實際上不會有太多內容。


我在這里看到的文字讓您認為-p選項應該按照您的想法執行:

在這種模式下,程序的變量不會傳播回 IPython 交互式命名空間(因為它們保留在分析器執行它們的命名空間中)。

它似乎確實描述了您在說什么,而我無法解釋為什么它沒有。 我什至嘗試了當前的 IPython 並且發生了同樣的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM