【问题标题】:Stop Windows from closing Python阻止 Windows 关闭 Python
【发布时间】:2014-03-16 12:31:32
【问题描述】:

这个问题可能已经问过几次了,但我似乎找不到。

基本上我只是在学习 Python,而且我在 Windows 上,这意味着我双击 .py 文件并打开它。这很有效,直到出现错误,此时 Python 调用 exit 并关闭窗口。

当然,解决这个问题的一种方法是在 Windows 中使用 cmd 程序并从那里运行 Python 程序,但是,有没有办法修复它,这样我的应用程序就不会退出并且如果我从 Windows 资源管理器打开它,它会在遇到错误时立即关闭?

while(True):
    try:
        number = input('Enter a number: ')

        if(is_int(number) is False):
            print('Please actually enter a number')
        if(number > 0):
            answer = input('Oh Noes you really want that?')
            if(answer == 'yes'):
                sys.exit(0);
    except KeyboardInterrupt:
        sys.exit(0)
    except Exception as e:

        input('')

【问题讨论】:

  • 最常见的方法是让它等待输入,然后忽略输入并终止脚本。
  • @SeçkinSavaşçı 好吧,我正在等待输入,但我的意思是说它达到了 TypeError 并由于我的应用程序编码错误而退出
  • 您能否将此示例添加到问题正文中以进行澄清?
  • @SeçkinSavaşçı 使用你刚才所说的我添加了最后一个,除了我正在发现如何正确打印出异常,已编辑
  • “正确”的方法是:(1) 使用cmd 或 (2) 使用 IDE(例如 IDLE,它随 python for windows 一起提供)

标签: python python-3.x


【解决方案1】:

为了使您的程序保持完整,例如为了不引入不需要的 catch-em-all 异常处理(又名 pokemon 处理),至少有三个选项:

  1. 使用任何控制台终端,例如内置 cmdpowershell 或任何第三方控制台应用程序。
  2. 使用任何 IDE:pycharm、IDLE(python windows 安装程序默认设置它)或任何你能够运行 python 代码的东西。
  3. 使用文本编辑器插件运行 python 代码。至少notepad++sublime text 能够做到这一点。

我建议初学者从选项 1 开始,然后慢慢转向选项 3 用于小型脚本和项目,然后选择选项 2 用于较大的脚本和项目。

【讨论】:

  • 像这样使用捕获所有错误处理程序是不是很糟糕?我习惯了 PHP,所以我想知道在 PHP 中创建全局错误处理程序是否是错误的。
  • @Sammaye 好吧,看看《Python 之禅》;在我看来,你会找到答案的。
  • @Sammaye 取决于您在异常处理程序中执行的操作以及脚本的用途。 PHP实际上仅限于动态网页,而python广泛用于“桌面”应用程序:脚本、cronjobs、科学软件等。虽然捕获网络中的所有内容以向最终用户隐藏它是有意义的,但在“桌面”应用程序中消除错误并不是一个好主意
  • @SeçkinSavaşçı 呵呵,是的,它确实违反了 Zen 代码下的一些原则
  • @J0HN Ok kool,我想我将专注于保持对有问题 atm 的功能和程序的错误
【解决方案2】:

如果您在脚本底部放置了一个input 函数,那么它将一直挂在那里,直到您按下回车键或关闭命令提示符。如果您调用退出函数,请在调用退出函数之前立即放置它。否则将其放在脚本的底部。

我还假设您已经在脚本中定义了 is_int?

【讨论】:

  • 是的,对不起,我试图省略函数来获得脚本的焦点
【解决方案3】:

你认为它应该做什么?

Python 正在绘制你看到的窗口,如果 python 崩溃,窗口就会消失。

您可以通过 cmd 或在 IDE 中运行它。 (就像 IDLE 一样,虽然在 GUI 方面有一些问题)

否则,在文件末尾添加类似这样的内容

try:
     run() 
except Exception as inst:
     print type(inst), inst.args
     #it prints the exception
     print sys.exc_traceback.tb_lineno 
     #if you want the line number where the error occurred in the source code
     raw_input()

inst 是异常实例,可以看到类型和参数列表。 然后使用 sys 模块你也可以看到代码中出现错误的那一行。

这样每个错误都会在关闭前得到处理和显示

这是正确的方法吗?

没有。您确实应该使用广告 IDE(例如带有 PyDev 或 PyCharm 的 Eclipse)。

【讨论】:

  • 但它并没有给出很好的输出,它给了我机器可读的错误输出
  • 感谢有关 IDE 的提示,我实际上使用的是 PyDev,但由于 PDT 自己的调试工具非常糟糕,我从不打扰 PyDevs,但实际上它们工作得很好
【解决方案4】:

在@SeçkinSavaşçı 一开始的非常有用的评论之后:

最常见的方法是让它等待输入,然后忽略输入并终止脚本。

我花了一秒钟才明白我去寻找如何做到这一点,所以首先我看到停止脚本并使用:

while(True):
    try:
        # Application code here
    except:
        input('')

在捕获所有错误方面非常有效,这与 PHP 不同(不幸的是,我已经习惯了)都是异常。

所以下一部分是告诉我发生了什么错误以及如何修复它,我需要回溯。碰巧 Python 文档在这里给了我答案:http://docs.python.org/2/library/traceback.html#traceback-examples 在一个易于查看的示例中:

exc_type, exc_value, exc_traceback = sys.exc_info()
print(traceback.print_exception(exc_type, exc_value, exc_traceback, limit=2, file=sys.stdout));

input('') 上方添加它,我完美的错误处理向我展示了我需要的一切。

谢谢大家,

【讨论】:

    【解决方案5】:

    尝试导入时间和 time.sleep()。另外,我建议您使用 IDLE 或 Geany。我一直在使用它们,效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      • 1970-01-01
      相关资源
      最近更新 更多