IPython在运行后维护命名空间

IPython在运行后维护命名空间,python,ipython,Python,Ipython,我试着到处寻找一种简单的方法来恢复类似MATLAB的功能:当我运行脚本时,我希望ipython维护我函数的名称空间 我有一个main函数,然后我有一个函数sim\u loop(),其中包含我试图调试的代码sim_loop()有一个大数组,我希望在脚本运行后能够显示该数组。我无法使用该功能(我假设它是“交互式名称空间”) 我有pdb工作,但是如果我退出pdb并想检查一个变量,我必须再次运行它(更不用说,没有自动完成和其他功能)。我已经在我的脚本中嵌入了一个IPython shell,但这并不能解决

我试着到处寻找一种简单的方法来恢复类似MATLAB的功能:当我运行脚本时,我希望ipython维护我函数的名称空间

我有一个main函数,然后我有一个函数
sim\u loop()
,其中包含我试图调试的代码
sim_loop()
有一个大数组,我希望在脚本运行后能够显示该数组。我无法使用该功能(我假设它是“交互式名称空间”)

我有
pdb
工作,但是如果我退出
pdb
并想检查一个变量,我必须再次运行它(更不用说,没有自动完成和其他功能)。我已经在我的脚本中嵌入了一个IPython shell,但这并不能解决我的问题,因为我想一次又一次地无缝执行脚本,并不断检查第二个函数(不是
main()
)中的变量

澄清 我希望在脚本从ipython中运行后,能够访问脚本的子例程的作用域

ie:我从ipython开始。然后我键入“runscript.py”。它运行和工作非常好。然后我希望能够检查范围内的变量“dummy”:main->sim\u loop->dummy


我希望能够检查它,然后使用“run script.py”再次运行我的脚本,然后再次检查“dummy”,这似乎是出于开发目的,您想要的是打破作用域,将局部变成全局,这可能不是最好的主意


作为一个可能的选择,你知道吗

要在主ipython命名空间中运行脚本:

ipython script.py
%run -i script.py
当然,这只是运行和退出。如果要在主ipython命名空间中运行脚本,然后放入REPL:

ipython -i script.py
如果您已经在ipython中,并且希望在现有的主ipython命名空间中运行脚本:

ipython script.py
%run -i script.py
您可能需要添加其他参数,例如,如果脚本在任何地方显式调用
sys.exit
,则可能需要
-e
参数

如果您只想在不运行“活动”代码的情况下将所有名称导入命名空间,则可以执行
%run-n-i script.py
如果脚本执行
如果
测试


当然,即使没有ipython,您也可以
execfile('script.py')
,其效果几乎与您所期望的效果完全相同(除了与本地人的一些奇怪交互,以及不在3.x中工作)。甚至脚本导入中的
*
可能已经足够接近了。

您只是在寻找
ipython-i myscript.py
?或者别的什么?我想他们想把局部变量从局部范围中分离出来,以达到调试的目的。我曾经问过一个类似的问题..当我尝试这个,然后尝试“whos”时,我得到了:Interactive namespace是空的@abernert:我正在寻找这个功能,但是是从ipython内部寻找的。会是“run-imyscript.py”吗?这会不会给我留下脚本的名称空间,包括子例程?@wim:这是我想要避免的行为;当我只想在成功执行后检查变量时,我不想被放入调试器。如果它有一个很长的名字,我更喜欢自动完成,据我所知,pdb没有。@virati:是的,
%run-I myscript.py
相当于
ipython-I myscript.py
,但从
ipython
内部。是的,它在交互式名称空间中运行文件。这就是你想要的吗?看来可以了。现在在arch回购协议中找不到它,但我会在时间不紧的时候尝试获取它。谢谢这不完全是我想要的,但到目前为止,ipdb正在发挥作用。再次感谢。不管是谁投了反对票,请留下评论解释为什么?不知道为什么有人投了反对票,但我觉得这很有用。就我个人而言,它的工作方式与我所希望的不同(我已将所有子例程代码移到main()中,在脚本成功完成后,它仍然不允许我访问名称空间)。不过,这让我对如何进行有了更好的了解,所以谢谢。这对我来说非常有效。这是我在Python中一直错过的一个Matlab特性。非常感谢!