cari

Rumah  >  Soal Jawab  >  teks badan

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

大家讲道理大家讲道理2803 hari yang lalu1310

membalas semua(3)saya akan balas

  • ringa_lee

    ringa_lee2017-04-18 09:05:10

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

    Pertama sekali, saya nyatakan bahawa terdapat masalah dengan perenggan ini. Ini adalah masalah pencetakan p.stdout.readline() != '' tidak sepatutnya diletakkan dalam seketika, kerana selepas data dibaca , ia akan dibuang , supaya data yang lengkap tidak boleh dicetak dan ditulis ke fail sad.txt
    Kedua, saya rasa p.stdout harus dibuat tanpa sekatan untuk menyelesaikan masalah yang tersekat

    import subprocess
    import os
    import fcntal
    
    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)
    flags = fcntl.fcntl(p.stdout, fcntl.F_GETFL)
    flags |= os.O_NONBLOCK
    fcntl.fcntl(p.stdout, fcntl.F_SETFL, flags)
    p.stdin.write('password\n')
    p.stdin.write('ifconfig\n')
    
    while True:
        try:
            line = p.stdout.readline()    #如果p.stdout中内容被读完之后,程序会卡在这里
            if line == '':
                break
            #line = line.strip()
            print line
            r.write(line)
        except IOError:
            break

    balas
    0
  • PHPz

    PHPz2017-04-18 09:05:10

    Terperangkap ini mungkin disebabkan oleh proses ssh tidak keluar.

    balas
    0
  • 高洛峰

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

    tersekat kerana paip kosong selepas membaca baris terakhir, dan untuk perintah ifconfig, baris terakhir bukan ruang tetapi n:

    p.stdin.write('ifconfig eth0\n')
    for line in iter(p.stdout.readline, '\n'):
        print line.strip()

    Untuk mengelakkan kematian yang disebabkan oleh IO, kaedah yang disyorkan secara rasmi adalah menggunakan communicate, seperti ini:

    out, err = p.communicate('ifconfig')

    balas
    0
  • Batalbalas