【问题标题】:Python exception handling does not work in os.systemPython 异常处理在 os.system 中不起作用
【发布时间】:2019-05-07 22:28:01
【问题描述】:
import webbrowser
import os
try:
    response=os.system('start notepad++.exe')
except OSError:
    webbrowser.open("https://www.rollapp.com/launch/notepad++")

如果系统中安装了notepad++,那么它应该打开,否则在线notepad++应该启动。

但是,tryexcept 不能以这种方式工作。

它是如何工作的?

【问题讨论】:

  • 看这个问题stackoverflow.com/questions/6466711/…。您将看到 os 库没有标准化的返回(因此不会被您的 except 子句捕获),因为它依赖于操作系统。此外,如果您的程序打开我的另一个程序(如果我有)或强迫我访问一个网站,我会非常恼火,您应该认真考虑另一种方法。
  • 另请参阅此问题:gis.stackexchange.com/questions/86522/…。似乎您可以改用 subprocess.call() ,这将返回 OSError
  • subprocess 确实是要走的路,它基于popen2 并提供适当的异常支持等。
  • os.system 不会在失败时引发异常。当您认为事情发生意外时,请考虑查阅文档。

标签: python


【解决方案1】:

这是因为OS 不会抛出异常,因为它(如预期的那样)非常依赖于操作系统,而是返回一个退出代码 (0),这在 documentation 中有明确描述。相反,您应该考虑使用subprocess.call(),它提供了一个超集(popen)。例如以下将起作用(我会让你担心找到记事本++的安装位置,hint)。

import webbrowser
import subprocess
try:
    # NOTE: The hardcoded path
    response=subprocess.call('C:/Program Files (x86)/Notepad++/notepad++.exe')
except OSError:
    webbrowser.open("https://www.rollapp.com/launch/notepad++")

【讨论】:

  • 不能通过“C:/Program Files (x86)/Notepad++/notepad++.exe”,因为它对于不同的用户是不同的,这就是为什么我们必须通过一般路径“start notepad++.exe”但是在这它不工作
  • @RahulChaudhary 这就是为什么尝试在某人的计算机上运行另一个程序是您不应该做的事情的原因。但是,我已经链接了另一个问题,该问题涉及查找程序的安装位置(因为它不是您所要求的)。
  • 实际上我正在尝试开发 windows10 的用户界面,这就是为什么我必须考虑一般路径
【解决方案2】:

try/except 适用于您的代码执行引发某种Exception 的情况,这在您的示例中没有发生。阅读更多关于这个here

您可以在response 中查找值以查看您尝试执行的命令的退出状态。 通常如果返回 0,则命令执行成功,否则不执行。 这意味着代码将如下所示:

response=os.system('start notepad++.exe')
if response != 0:
    webbrowser.open("https://www.rollapp.com/launch/notepad++")

【讨论】:

  • 不要这样做,这会使它非常依赖操作系统
  • @BasJansen 我的错。我应该删除它还是让其他人看到?
  • 这取决于您,您的答案将在特定情况下起作用,因此这不是“错误”本身,但它不是理想的(恕我直言)。
  • 当 os.system('start notepad++.exe') 执行时通过 cmd 抛出异常,然后我们必须在浏览器打开后手动处理它有没有办法处理该异常
  • 如果您需要处理命令执行的异常,您必须使用@BasJansen 的方法。您是否尝试用 subprocess.call('start notepad++.exe') 替换 os.system('start notepad++.exe') 调用? (该命令的有效性是另一个问题)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-07
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2016-03-18
相关资源
最近更新 更多