ホームページ  >  に質問  >  本文

python - 使用subprocess调用外部程序,p.stdout读取内容卡死

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之后还会跳回登录界面,进程还是没有结束

大家讲道理大家讲道理2741日前1275

全員に返信(3)返信します

  • ringa_lee

    ringa_lee2017-04-18 09:05:10

    リーリー

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

    返事
    0
  • PHPz

    PHPz2017-04-18 09:05:10

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

    返事
    0
  • 高洛峰

    高洛峰2017-04-18 09:05:10

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

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

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

    リーリー

    返事
    0
  • キャンセル返事