如何判断subprocess.Popen()在shell=True时失败

8 投票
2 回答
12717 浏览
提问于 2025-04-15 22:52

Windows版本的Python 2.6.4:有没有办法判断在使用shell=True时,subprocess.Popen()是否失败?

当shell=False时,Popen()会成功地报告失败。

>>> import subprocess
>>> p = subprocess.Popen( 'Nonsense.application', shell=False )
Traceback (most recent call last):
  File ">>> pyshell#258", line 1, in <module>
    p = subprocess.Popen( 'Nonsense.application' )
  File "C:\Python26\lib\subprocess.py", line 621, in __init__
    errread, errwrite)
  File "C:\Python26\lib\subprocess.py", line 830, in
_execute_child
    startupinfo)
WindowsError: [Error 2] The system cannot find the file specified

但是当shell=True时,似乎没有办法判断Popen()调用是否成功。

>>> p = subprocess.Popen( 'Nonsense.application', shell=True )
>>> p
>>> subprocess.Popen object at 0x0275FF90>>>
>>> p.pid
6620
>>> p.returncode
>>>

欢迎提供想法。

祝好,

Malcolm

2 个回答

5

在第一种情况下,它无法启动;在第二种情况下,它成功启动了一个命令行界面,但这个命令行又无法执行应用程序。所以你的进程已经正确地启动了,然后退出了,现在在等你去查看它的退出代码。问题是,除非你的命令行或环境(比如没有内存)完全坏掉,否则Popen本身是不会失败的

所以,你可以放心地使用.poll().wait()来获取所有的坏消息。

16

returncode 这个东西是可以用的,不过在你调用 p.poll() 之前,它的值会是 None。而 poll() 这个方法本身会返回错误代码,所以你可以直接这样做:

if a.poll() != 0:
    print ":("

撰写回答