两个子进程之间的Python管道输出

时间:2011-01-31 01:27:05

标签: python unix subprocess

我正在开发一些代码,这些代码将通过SSH来阻止一个块设备,我想用子进程执行此操作,这样我就可以在传输过程中监视DD的状态(使用SIGUSR1杀死dd进程以获取它的当前状态,并使用选择读取。

我试图实现的命令是这样的:

dd if=/dev/sda | ssh root@example.com 'dd of=/dev/sda'

我尝试的当前方法是:

dd_process = subprocess.Popen(['dd','if=/dev/sda'],0,None,None,subprocess.PIPE, subprocess.PIPE)  
ssh_process = subprocess.Popen(['ssh','root@example.com','dd of=/dev/sda'],0,None,dd_process.stdout)

然而,当我运行它时,SSH过程在10-40秒后就会失效 我在这里完全是钝的,还是没有办法在这样的子过程之间进行管道?

编辑:原来我的真实代码中没有主机名。这是做事的正确方法。

2 个答案:

答案 0 :(得分:19)

from subprocess import Popen, PIPE
dd_process = Popen(['dd', 'if=/dev/sda'], stdout=PIPE)
ssh_process = Popen(['ssh', 'root@example.com', 'dd','of=/dev/sda'],stdin=dd_process.stdout, stdout=PIPE)
dd_process.stdout.close() # enable write error in dd if ssh dies
out, err = ssh_process.communicate()

这是将第一个流程输出PIPE到第二个流程的方法。 (注意ssh_process中的stdin)

答案 1 :(得分:4)

sh Python库可以轻松调用OS命令并管理它们。

来自文档:

for line in tr(tail("-f", "test.log", _piped=True), "[:upper:]", "[:lower:]", _iter=True):
    print(line)
相关问题