linux - 当 shell=True 时检测 Popen() 错误

标签 linux python-2.7 subprocess

我想在该用户的 $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/

相关文章:

linux - 构建 busybox,包括内核头文件、要包含哪些文件

python-2.7 - opencv python2.7实现中的自适应双边滤波器

python - 属性错误 : 'FreqDist' object has no attribute 'inc'

python - 如何干净地导入 bencode?

python - 使用 Python 自动输入以暴力破解在 cli 中运行的程序

c - 如何在 Linux 中创建高分辨率计时器来测量程序性能?

c - 内核如何检测内核空间段错误?

linux - 无法在 CentOS 中运行 cat 命令(参数列表太长)

python - 如何将子流程的结果放入变量中

python - 允许 python 子进程的多个输入