Питон не хочет работать правильно
Всем привет , у меня проблема , что питон не хочет пинговать нормально. Вот код на который он жалуется.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs, sys
import subprocess
file = open('file.txt','r')
inde = (file.read())
file.close()
print(inde)
for y in inde:
cmd = 'ping ' +y
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out = p.stdout.read() #в переменной out находится вывод команды ping.
f = open('workfile.txt', 'a')
print(out.decode('cp866'))
f.write(out.decode('cp866'))
if "PING: сбой передачи. Общий сбой." in out.decode('cp866'):
print(y)
continue
f.close()
В файле file.txt написанно "1.1.1.1","1.1.1.2","1.1.1.3"
Он берёт в начале пингует мой пк (хз зачем) , потом пингует 0.0.0.1 , потом мой пк , потом 0.0.0.1 и через несколько попыток он переходит к 0.0.0.2 но на следующей попытке он пингует мой пк , потом опять 0.0.0.1.
Тут я понял что он пингует каждый символ . в этом и проблема , ибо когда в inde записываю эти ip , то он пингуует нормально , а когда читает с файла , пингует не правильно . Помогите пожалуйста.
Ответы (1 шт):
Всё дело в том, что когда ты выполняешь команду inde = (file.read()) то у тебя читается весь файл в объект строку (можешь проверить сам что за тип объекта, выполнив print(type(inde)). Должно быть class 'str'). Поэтому когда ты далее используешь итератор по строке он в y пишет каждый символ. А затем последовательно выполняет такие команды "ping "" (что почему-то приводит к пингу твоего компа), затем "ping 1" (что приводит к пингу 0.0.0.1), затем "ping ." (что приводит к ошибке), потом следующий символ и так далее каждый символ...думаю суть уловил.
РЕШЕНИЕ: чтобы после чтения файла у тебя в inde появился список адресов, просто добавь одну команду, которая разделяет считанную строку по запятым и формирует список строк: inde = inde.split(","). Код будет выглядеть так:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import codecs, sys
import subprocess
file = open('file.txt','r')
inde = file.read()
inde = inde.split(",") # here the solution!
file.close()
for y in inde:
cmd = 'ping ' + y
print(cmd)
p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE)
out = p.stdout.read() #в переменной out находится вывод команды ping.
f = open('workfile.txt', 'a')
print(out.decode('cp866'))
f.write(out.decode('cp866'))
if "PING: сбой передачи. Общий сбой." in out.decode('cp866'):
print(y)
continue
f.close()