whos
命令查看当前内核中存储的 所有 变量。k, g, lx = .4, .8, 6.6
m = k*g*lx**2
whos
Variable Type Data/Info
-----------------------------
g float 0.8
k float 0.4
lx float 6.6
m float 13.939200000000001
但是,正如所说的,它显示所有变量,因此它将显示您运行过的早期单元格中的其他变量。
可以使用Python内置函数locals()或globals()命令来实现类似的结果,它们返回一个变量字典。但是Jupyter的表示方式更加美观。
或者您可以使用交互式Shell。这将改变单元格的行为,并像Python shell一样运行,因此一旦运行,它将输出每个调用的值(到输出单元格)。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
k
g
... do stuff ...
lx
m
... do more stuff ...
输出:
Out[2]: 0.4
Out[2]: 0.8
Out[2]: 6.6
Out[2]: 13.939200000000001
最后,您可以通过将其设置为last_expr
来将交互性恢复为默认值。
InteractiveShell.ast_node_interactivity = "last_expr"
k, g, lx, m
Out[3]: (0.4, 0.8, 6.6, 13.939200000000001)
所以,这是一个难题。基本上,我们只是试图抓住当前单元格中的所有行并提取变量。事实证明,我们不能使用IPython定义的全局变量(例如_
,__
,_i<n>
等)如Programmatically get current Ipython notebook cell output?建议的那样,因为(据我所做的实验所示),您只能从先前执行的单元格中获取值,而不能从当前执行的单元格中获取。
幸运的是,结果发现使用魔术命令%history
确实可以获取当前单元格的输入。所以,借助这个链接和这个链接,我创建了一个函数,正好可以满足您的需求:
def cell_vars(offset=0):
import io
from contextlib import redirect_stdout
ipy = get_ipython()
out = io.StringIO()
with redirect_stdout(out):
ipy.magic("history {0}".format(ipy.execution_count - offset))
#process each line...
x = out.getvalue().replace(" ", "").split("\n")
x = [a.split("=")[0] for a in x if "=" in a] #all of the variables in the cell
g = globals()
result = {k:g[k] for k in x if k in g}
return result
您可以通过以下方式进行测试:
a = 1
b = 2
c = 3
cell_vars()
代码应该会产生{'a': 1, 'b': 2, 'c': 3}
,然后您可以根据自己的喜好进行格式化和打印。显然,我的行处理存在一些限制(假设所有感兴趣的变量都在全局范围内)。
希望这对您有用!
ipy.run_line_magic("history", format(ipy.execution_count - offset)
。 - wjmatthewsimport inspect
k = 0.0417
g = 0.829
lx = 6.6
m = k*g*lx**2
def get_name(lst=[]):
local_vars = inspect.currentframe().f_back.f_locals.items()
for i in local_vars:
lst.append(i)
return dict(lst)
import pandas as pd
df = pd.DataFrame(get_name(), index=[0])
result = df.T.loc[df.dtypes != object]
print(result)
0
g 0.829
k 0.0417
lx 6.6
m 1.50584