【发布时间】:2013-03-19 14:24:49
【问题描述】:
我有一个 bash 脚本 myscript.sh:
#!/bin/bash
while read line; do
myprog.py
done
调用python程序myprog.py
#!/usr/bin/env python
import subprocess
output = subprocess.check_output(['ssh', 'user@host', 'cmd'])
子进程调用的ssh命令执行无误,输出正确。但是当这样调用时,myscript.sh 中的循环仅运行第一行输入,然后以状态 0 退出。如果我将 subprocess.check_output(...) 调用替换为 subprocess.Popen(...) 并且 不要随后调用Popen.wait(),然后外部循环按预期工作,ssh 命令的输出在 bash 脚本的任何输出之后的一段时间内被转储到标准输出。 Popen.wait() 的行为与 check_output 的行为相同:bash 循环在退出之前只经过一次迭代而不会出错。
如果不是ssh 另一个命令,例如ls,用 check_output 调用,然后 bash 循环按预期工作。
谁能帮我理解为什么显示的代码没有按预期工作?
注意:这是我正在尝试做的简化版本,尽管我确实遇到了与此代码相同的行为。实际上,我在 bash 脚本中使用“$line”做一些事情,并且子进程调用包含在 try/except 块中。
【问题讨论】:
-
有根据的猜测:
ssh进程正在消耗标准输入。尝试将stdin=open("/dev/null")传递给check_output。 -
感谢@larsmans 我同时也有大致相同的想法。在 ssh 命令中添加 -n 参数就可以了!
标签: python bash ssh subprocess