2

サーバーからUbuntuクライアントへのコマンドを実行するために、subprocess.Popenを使用してpythonプログラムを実装しました。サブプロセスは、すべての出力を 1 行ずつ読み取る必要があります。私のプログラムは Eclipse 環境で完全に動作します。すべての出力が期待どおりに印刷されます。しかし、Python インタラクティブ シェル (Windows と Linux の両方) でプログラムを実行すると、subprocess.Popen はすべてのコマンド出力を読み取れませんでした。出力はほとんど表示されず、Python はエラーなしでクラッシュします。ここに私のプログラムコードがあります:

def execute(self, IP_Instance, command):

    keypairs_directory = Config.keypairs_directory

    cmd = 'ssh ubuntu@%s'%IP_Instance+' -i %s'%keypairs_directory+' %s'%command

    cmd_run = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
    for line in cmd_run.stdout:
        print line         
    cmd_run.wait()

たとえば、コマンドを送信すると:

a.execute('xxx.xxx.xxx.xxx', 'ls -l')

出力があります

total 0

大丈夫です。しかし、私が送るとき:

a.execute('xxx.xxx.xxx.xxx', 'sudo apt-get update')

プログラムは

Fetched 8,364 kB in 6s (1,205 kB/s)
Reading package lists...

そしてPythonはに戻ります

>>>

私は communicate()[0], poll() を試しましたが、効果がありませんでした。すべてのマシンで Python 2.7 を使用しています。私は何を間違っていますか?

4

1 に答える 1

2

コマンドは標準エラーでもデータを返すため、apt-get updateデータもキャッチする必要がありstderrます。

subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

そして、 と の両方を使用する必要がPopen.stdoutありPopen.stderrます。

于 2012-11-02T09:43:46.417 に答える