找回密码
 立即注册
搜索
0

Popen没有提出例外

lacken 2024-7-29 14:02:31 73 显示全部楼层
[md]在你提供的 Python 脚本中,你尝试使用 `subprocess.Popen` 来运行 `xdg-open` 命令,并期望在命令失败时捕获一个异常。然而,`subprocess.Popen` 本身并不会在命令执行失败时抛出异常;它只是启动一个子进程。异常(如果发生)只会在子进程尝试执行命令时产生,并且这些异常不会自动传播回父进程。

如果你想要捕获由于无效参数导致的 `xdg-open` 命令失败,你需要等待子进程结束,并检查它的退出状态码。如果退出状态码不是 0,这意味着命令执行失败。这里是如何修改你的代码来实现这一点:

```python
import subprocess

try:
    # 启动子进程执行 xdg-open 命令
    process = subprocess.Popen(["xdg-open", "invalid"])
   
    # 等待子进程结束
    process.wait()
   
    # 检查子进程的退出状态码
    if process.returncode != 0:
        print("Exception: xdg-open command failed with return code", process.returncode)
    else:
        print("Launched successfully")
except Exception as e:
    print("An exception occurred:", e)
```

这段代码会启动 `xdg-open` 命令,然后等待它结束。之后,它会检查进程的 `returncode`。如果 `returncode` 不为 0,它会打印出相应的错误消息。如果 `returncode` 为 0,它会打印出成功启动的消息。如果捕获到其他异常,它会打印出 "An exception occurred"。

请注意,`subprocess.Popen` 可能抛出的异常类型是 `OSError` 或其子类,如果你想要捕获这类异常,应该使用 `except OSError as e:` 而不是 `except:`,以避免捕获不必要的异常,并且可以提供更具体的错误信息。

关于你提到的环境:Python 3.10.12 在 Ubuntu 22.04.4 LTS 上运行,这应该不是问题所在,因为 `subprocess` 模块在 Python 中是标准且稳定的。问题更可能是由于命令执行失败,而不是 Python 或其环境。
[/md]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册