【问题标题】:How to determine subprocess.Popen() failed when shell=True当 shell=True 时如何确定 subprocess.Popen() 失败
【发布时间】:2010-05-18 22:19:12
【问题描述】:

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
>>>

赞赏的想法。

问候, 马尔科姆

【问题讨论】:

    标签: python subprocess popen


    【解决方案1】:

    returncode 可以工作,尽管在您调用p.poll() 之前它会是Nonepoll()本身会返回错误码,所以你可以这样做

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

    【讨论】:

    • 感谢两位的回答。 poll() 后跟 returncode 技术正是我正在寻找的解决方案。
    【解决方案2】:

    在第一种情况下它无法启动,在第二种情况下 - 它成功启动了 shell,而 shell 又无法执行应用程序。因此,您的进程已正确生成、退出并等待您查询其退出代码。所以,问题是,除非您的外壳或环境(例如,没有内存)完全损坏,否则Popen 本身不可能失败

    所以,您可以放心地在上面.poll().wait() 了解所有不幸的消息。

    【讨论】:

      猜你喜欢
      • 2019-02-04
      • 2022-11-23
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多