17

サブプロセスモジュールを使用して外部プログラム(plink.exe)を呼び出し、サーバーにログインしています。しかし、communicateを呼び出して出力を読み取ると、ブロックされています。コードは以下のとおりです。

 import subprocess
 process = subprocess.Popen('plink.exe hello@10.120.139.170 -pw 123456'.split(), shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 print process.communicate() #block here

plink.exeブロックがまだ実行されているためだと私は知っています。しかし、サブプロセスが終了する前に出力を読み取る必要があります。とにかくそれをすることはありますか?

4

3 に答える 3

32

このメソッドの全体的な目的はcommunicate、プロセスが終了するのを待って、すべての出力を返すことです。待ちたくない場合は、電話しないでくださいcommunicate。代わりに、stdoutまたはstderr属性から読み取って出力を読み取ります。

プロセスがとの両方stdoutに出力する場合stderr(そしてそれを別々に読み取りたい場合)、ブロックせずに両方から実際に読み取るように注意する必要があります。そうしないと、デッドロックが発生する可能性があります。これはWindowsではかなり難しいので、pexpect代わりにモジュールを使用することをお勧めします。

于 2010-01-25T15:41:06.993 に答える
0

lmstat -a1つのコマンドを実行してから、ターミナルの出力を取得する必要があるという同様の状況に直面しました。

単一のコマンドを実行してから出力を読み取る必要がある場合は、次のコードを使用できます。

import subprocess

Username = 'your_username'
Password = 'your_password'
IP = 'IP_of_system'
Connection_type = '-ssh' #can have values -ssh -telnet -rlogin -raw -serial

p = subprocess.Popen(['plink', Connection_type, '-l', Username, '-pw', Password, IP], \
                     shell = False, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = p.communicate('lmstat -a\nexit\n'.encode())
print(out.decode())
于 2012-12-11T11:48:32.663 に答える