我想在该用户的 $SHELL
中执行任意用户提供的命令。该命令可能是短暂的(如 ls
)或长期的(如 firefox
),它可能是单个命令、管道或任何其他 shell-支持的构造。
执行方法必须代表 shell 指示成功或失败,并且无论命令何时或是否终止,不得阻塞。命令可能永远不会终止,直到执行方法返回并且我的程序继续。
Popen()
with shell=True
不会阻塞但也不表示失败。 subprocess
辅助函数会阻塞并且在这里没有用。 Popen.poll()
(在 this question 中建议)在命令终止之前返回 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()
错误,我的想法是否正确?
最佳答案
我没有直接回答您的问题,但是使用 plumbum
完成此类任务可以让您的生活变得更加轻松。 http://plumbum.readthedocs.org/en/latest/
关于linux - 当 shell=True 时检测 Popen() 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15236621/