8

我对 python 比较陌生,但对使用 IDL 有一些经验。我想知道是否有人知道 python 中是否有用于 IDL 的 stop 和 .reset 命令的等效命令。

如果我正在运行一些我写的 IDL 脚本,我在其中放置了一个停止命令,基本上它所做的就是在那里停止脚本并让我访问脚本中间的命令行。所以我可以访问我在停止命令之前定义的所有函数和变量,我发现它们对调试非常有用。

我发现 .reset 命令也非常有用。它所做的是重置 IDL 环境(清除所有变量、函数等)。就好像我关闭了该会话并打开了一个新会话,但无需退出并重新启动 IDL。我发现如果我尝试调试我编写的脚本,有时从头开始而不需要重置 IDL(或现在的 python)很有用。在 python 中能够取消导入我之前导入的任何模块也会很有用。

对于这些问题的任何帮助将不胜感激。

干杯

有关的

4

8 回答 8

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 中设置 a = 10(使用上面的示例),a 在主 python 进程中仍然等于 5。

编辑: 在我第一次看到这种技术的 IPython 用户邮件列表上发帖。

于 2010-02-08T12:12:32.687 回答
1

使用 pdb,就像在这个简短的脚本中一样。在命令行运行它,PDB 提示符会神奇地出现,允许单步执行、任意表达式求值等。

#!/usr/bin/env  python
import pdb;

print 1
print 2
pdb.set_trace()
print 3
print 4
于 2010-05-23T12:54:39.207 回答
1

您可以%reset在 IPython shell 中执行此操作。

对于停止,只需添加提到的 pydebug 断点

于 2014-08-28T20:00:19.057 回答
1

stop听起来等同于使用code模块。.reset除了无偿使用del.

于 2010-01-29T15:46:57.150 回答
1

pdb.set_trace()打破代码显然不允许您从那时起“.continue”(IDL命令)(来自http://pythondammit.blogspot.fr/2012/04/equivalent-of-idls-stop-command.html

于 2016-03-03T02:25:23.743 回答
1

redacted解决方案的更新。交互式 IPython 比 pdb.set_trace 更强大、更方便。

试试这个脚本

from IPython import embed
a = 1
b = 2
print('before')

embed()

print('after')
c = 3

放在embed()你想打断的地方。运行脚本你会进入一个交互式的IPython Shell,你可以查看和修改变量。退出 shell 后脚本将继续。

于 2017-04-07T05:07:24.387 回答
0

欢迎来到 Python 社区!我还在学习,但 imo Python 比交互式数据语言更好。

无论如何,Ignacio 关于使用代码模块的回答看起来可以提供你想要的,至少与 IDL 的停止平行。

您可能会发现有用的另一件事是进入 Python 的交互模式并导入您的程序。然后,您可以通过运行函数等与之交互。(诚然,我不是这方面的专家。)如果这样做,您将需要驱动程序的文件中的 main() 函数。例如,你会有类似的东西:

import sys
def main():
    # do stuff
    return(0)

if __name__ == '__main__':
    sys.exit(main())

而不仅仅是:

# do stuff

当您将程序拉入 Python 解释器时,这会阻止程序的执行。有关更多信息,请参阅Guido 关于主要功能的文章

于 2010-01-29T18:15:49.150 回答
0

您可能只想为此使用 Python 调试器。

于 2010-01-24T17:34:05.897 回答