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

大家讲道理
大家讲道理

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

membalas semua(3)
左手右手慢动作
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
PHPzhong

Terperangkap ini mungkin disebabkan oleh proses ssh tidak keluar.

小葫芦

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')
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan