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

标签 python unix subprocess

我正在编写一些代码,这些代码将通过 SSH DD block 设备,我想用子进程执行此操作,以便我可以在传输期间监视 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 秒后失效。
我在这里是完全迟钝了,还是没有办法像这样在子流程之间进行管道传输?

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

最佳答案

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

这是将第一个过程输出通过管道传递给第二个过程的方法。 (注意 ssh_process 中的标准输入)

关于两个子进程之间的 Python 管道输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4846891/

相关文章:

无法接收到所有的SIGCHLD

python - subprocess.Popen.stdout - 实时读取标准输出(再次)

python - 在 python 3 中使用 pip 导入运行时安装的模块

python - 在 python/pandas 数据框中使用 group by 函数

bash - 为什么在可执行文件或脚本名称之前需要 ./(点斜杠)才能在 bash 中运行它?

regex - sed regex命令输出以html结尾的行?

python - 使用sherlock通过python subprocess模块​​检查是否抄袭

python - 使用 Python 检查字符串是否在文件中

python - 在 OpenShift Python Hosting 上的端口上打开套接字

python - 如何像我们在 pyspark withColumn 中那样在 pandas 中动态创建新列