我对python比较新,但有一点使用IDL的经验。我想知道是否有人知道在python中是否有与IDL的stop和.reset命令相同的命令。
如果我正在运行一些IDL脚本,我写了一个停止命令,基本上它的作用是停止那里的脚本并让我访问脚本中间的命令行。所以我可以访问我在stop命令之前定义的所有函数和变量,我觉得这对调试非常有用。
.reset命令我觉得非常有用。它的作用是重置IDL环境(清除所有变量,函数等)。就好像我关闭了那个会话并打开了一个新会话,但无需退出并重新启动IDL。我发现,如果我正在尝试调试脚本,我写它有时从头开始有用,而不必重置IDL(或现在的python)。在python中,能够取消导入我之前导入的任何模块也很有用。
非常感谢对这些问题的任何帮助。
干杯
答案 0 :(得分:3)
IPython(除了比标准的python解释器更好的REPL)可以做你想要的:
from IPython.Shell import IPShellEmbed
start_shell = IPShellEmbed()
def times_2(x):
return 2*x
a = 5
start_shell()
# now in IPython shell
# a -> 5
# times_2(a) -> 10
请注意,您在shell中执行的任何更改都不会在退出时发送回主python进程 - 如果您在IPython中设置= 10(使用上面的示例),则仍然是在主python进程中等于5。
编辑: post on IPython-user mailing list我第一次看到这种技术。
答案 1 :(得分:1)
stop
听起来相当于使用code
模块。 .reset
在Python中没有等同于del
的无偿使用。
答案 2 :(得分:1)
使用pdb,就像在这个简短的脚本中一样。在命令行运行它,PDB提示将神奇地出现,允许单步执行,评估任意表达式等。
#!/usr/bin/env python
import pdb;
print 1
print 2
pdb.set_trace()
print 3
print 4
答案 3 :(得分:1)
您可以在IPython shell中执行%reset
。
对于停靠点,只需添加pydebug断点,如上所述
答案 4 :(得分:1)
pdb.set_trace()
突破代码显然不允许你从那个点开始“继续”(IDL命令)(来自JMESPath)
答案 5 :(得分:1)
更新已修订的解决方案。 交互式IPython比pdb.set_trace更强大,更方便。
试试这个脚本
from IPython import embed
a = 1
b = 2
print('before')
embed()
print('after')
c = 3
将embed()
放在要中断的位置。
运行脚本您将进入交互式IPython Shell,您可以查看和修改变量。
退出shell后,脚本将继续运行。
答案 6 :(得分:0)
您可能只想使用Python调试器。
答案 7 :(得分:0)
欢迎来到Python社区!我还在学习,但是Python比互动数据语言更好。
无论如何,Ignacio关于使用代码模块的回答看起来可能提供你想要的东西,至少与IDL的停止并行。
您可能会觉得有用的另一件事是进入Python的交互模式并导入您的程序。然后你可以通过运行函数等与它进行交互。(不可否认,我不是这方面的专家。)如果这样做,你需要在驱动程序的文件中使用main()函数。例如,你有类似的东西:
import sys
def main():
# do stuff
return(0)
if __name__ == '__main__':
sys.exit(main())
而不只是:
# do stuff
当您将程序拉入Python解释器时,这会阻止程序的执行。有关更多信息,请参阅Guido's article about main functions。