私は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()
ssh
Popen.wait()
check_output
ssh
別のコマンドの代わりに、たとえばls
が呼び出されたcheck_output
場合、bash ループは期待どおりに機能します。
示されているコードが期待どおりに機能しない理由を理解できる人はいますか?
注: これは私がやろうとしていることの単純化されたバージョンですが、このコードでも同じ動作が発生します。実際には、bash スクリプトで「$line」を使用して何かを行っており、サブプロセス呼び出しはtry
/except
ブロックでラップされています。