1

私は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 コマンドはエラーなしで実行され、出力は正しいです。しかし、このように呼び出されると、ループは入力の最初の行のみを実行し、ステータス 0 で終了します。呼び出しを amyscript.shに置き換え、その後呼び出しを行わないと、外側のループは期待どおりに機能し、コマンドからの出力は次のようになります。 bashスクリプトからの出力の後、しばらくして標準出力にダンプされます。動作はwithと同じです: bash ループは、エラーなしで終了する前に 1 回の反復のみを実行します。 subprocess.check_output(...)subprocess.Popen(...)Popen.wait()sshPopen.wait()check_output

ssh別のコマンドの代わりに、たとえばlsが呼び出されたcheck_output場合、bash ループは期待どおりに機能します。

示されているコードが期待どおりに機能しない理由を理解できる人はいますか?

注: これは私がやろうとしていることの単純化されたバージョンですが、このコードでも同じ動作が発生します。実際には、bash スクリプトで「$line」を使用して何かを行っており、サブプロセス呼び出しはtry/exceptブロックでラップされています。

4

1 に答える 1

2

@larsmansが推測したように、ssh呼び出しはstdinを消費し、外側のbashループを壊しました。コマンドに-nオプションを追加すると、問題が解決しました。ssh

output = subprocess.check_output(['ssh', '-n', 'user@host', 'cmd'])
于 2013-03-28T23:30:20.317 に答える