python - 使用subprocess调用外部程序,p.stdout读取内容卡死
大家讲道理
大家讲道理 2017-04-18 09:03:10
0
3
1311
import subprocess
import os
r=open("sad.txt",'a')
p = subprocess.Popen("ssh.exe root@192.168.58.154", stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE, shell = False)
p.stdin.write('password\n')
p.stdin.write('ifconfig\n')

while p.stdout.readline()!=' ':
    line = p.stdout.readline()    #如果p.stdout中内容被读完之后,程序会卡在这里
    #line = line.strip()
    print line
    r.write(line)   

这个卡死如何解决,这时候结束当前进程也没办法结束
或者如何判断卡死,然后p.kill()或“ctrl+c”当前进程
ssh执行p.stdin.write('exit\n')也不行,因为ssh exit之后还会跳回登录界面,进程还是没有结束

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全員に返信(3)
左手右手慢动作

リーリー

まず、この段落には問題があることを指摘します。これは印刷上の問題です。データが読み取られた後なので、しばらくの間は p.stdout.readline() を配置すべきではありません。 、完全なデータを印刷したり、sad.txt ファイルに書き込んだりすることはできません。
次に、行き詰まった問題を解決するには、p.stdout をノンブロッキングにする必要があると思います。 リーリー

いいねを押す +0
PHPzhong

このスタックは、おそらく ssh プロセスが終了していないことが原因です。

いいねを押す +0
小葫芦

がスタックしているのは、最後の行を読み取った後にパイプが空になっていて、ifconfig コマンドの場合、最後の行がスペースではなく n:

であるためです。 リーリー

IO による死亡を防ぐために、公式に推奨されている方法は、次のような communicate を使用することです:

リーリー
いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート