python - 使用subprocess调用外部程序,p.stdout读取内容卡死
大家讲道理
大家讲道理 2017-04-18 09:03:10
0
3
1314
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之后还会跳回登录界面,进程还是没有结束

大家讲道理
大家讲道理

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

répondre à tous(3)
左手右手慢动作
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
PHPzhong

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

小葫芦

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')
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal