IPython运行后维护命名空间

vir*_*ati 15 python ipython

我试图寻找一种简单的方法来重新获得类似MATLAB的功能:当我运行脚本时,我希望ipython维护我的函数的命名空间.

我有一个main函数,然后我有一个函数sim_loop(),它有我正在尝试调试的代码.sim_loop()有一个大型数组,我希望能够在我的脚本运行后显示.我无法使用该功能(我认为它是"交互命名空间").

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

为了澄清 我希望能够在脚本从ipython中运行后访问我脚本的子例程的范围.

即:我开始ipython.然后我输入"run script.py".它运行和工作完美.我希望能够检查范围内的变量"dummy":main-> sim_loop-> dummy

我希望能够检查它,然后使用"run script.py"再次运行我的脚本,然后再次检查"dummy".

aba*_*ert 24

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

ipython script.py
Run Code Online (Sandbox Code Playgroud)

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

ipython -i script.py
Run Code Online (Sandbox Code Playgroud)

如果您已经在ipython中,并且想要在现有的主ipython命名空间中运行该脚本:

%run -i script.py
Run Code Online (Sandbox Code Playgroud)

您可能需要添加其他参数 - 例如,如果您的脚本显式调用sys.exit任何地方,您可能需要一个-e参数.

如果您只想将所有名称导入到命名空间而不运行"活动"代码,则可以%run -n -i script.py在脚本执行if __name__ == '__main__'测试时执行此操作.

当然,即使没有ipython,您也可以execfile('script.py')使用与您正在寻找的几乎完全相同的效果(除了与本地人的一些奇怪的交互,而不是在3.x中工作).或者甚至from script import *可能足够接近.


wim*_*wim 2

您似乎想要的是打破开发目的的范围,将本地变量变成全局变量,这可能不是最好的主意。

作为可能的替代方案,您了解ipdb吗?