recherche

Maison  >  Questions et réponses  >  le corps du texte

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

大家讲道理大家讲道理2885 Il y a quelques jours1346

répondre à tous(3)je répondrai

  • 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)  
        

    Tout d'abord, je souligne qu'il y a un problème avec ce paragraphe. Il s'agit d'un problème d'impression p.stdout.readline() != '' ne doit pas être placé dans un moment, car après la lecture des données. , il sera supprimé, de sorte que les données complètes ne puissent pas être imprimées et écrites dans le fichier sad.txt
    Deuxièmement, je pense que p.stdout devrait être rendu non bloquant pour résoudre le problème bloqué

    .
    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

    répondre
    0
  • PHPz

    PHPz2017-04-18 09:05:10

    Ce blocage est probablement dû au fait que le processus ssh ne se termine pas.

    répondre
    0
  • 高洛峰

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

    est bloqué car le tube est vide après lecture de la dernière ligne, et pour la commande ifconfig, la dernière ligne n'est pas un espace mais n:

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

    Pour prévenir les décès causés par IO, la méthode officiellement recommandée est d'utiliser communicate, comme celle-ci :

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

    répondre
    0
  • Annulerrépondre