我想在该用户的$SHELL
. 该命令可能是短期的(如ls
)或长期的(如firefox
),它可能是单个命令、管道或任何其他 shell 支持的构造。
执行方法必须代表 shell 指示成功或失败,并且无论命令何时终止或是否终止,都不得阻塞。在执行方法返回并且我的程序继续之前,该命令可能永远不会终止。
Popen()
withshell=True
不会阻塞,但也不表示失败。辅助函数确实阻塞并且在subprocess
这里没有用。Popen.poll()
(在这个问题中建议)返回None
直到命令终止并且不会立即返回非None
失败(必须重复调用它直到 shell 终止)。
作为所需行为的示例
prog1 = shell_run('blocking_prog', stdin=PIPE, stdout=PIPE)
prog2 = shell_run('nonsense_prog', stdin=PIPE, stdout=PIPE)
第一行应该将一个Popen
对象分配给prog1
,第二行应该提出一个OSError
或类似的。
我认为在这些条件下不可能可靠地检测到错误是正确的吗?Popen()