2014-04-30 1 views
1

Je suis un noob total à python. Mais ont beaucoup d'expérience CLI sur Cisco et autres. J'ai décidé de faire de Python mon outil de script 'go to'. Et bien, j'ai lamentablement échoué mon premier essai même en volant la plupart du code ... r n affiche sous forme de chaîne dans mon fichier texte

Je fais un ping d'une liste d'hôtes. Le but est de 1. Valider est vivant et 2. obtenir l'IP

Le script que j'ai obtenu en ligne a fonctionné après un peu de peaufinage pour la version 3.4.

L'affichage montre parfait comme je veux. Le fichier qu'il écrit est juste une longue ligne qui semble avoir le \ r \ n juste écrit dans le cadre du texte. C'est le code et un échantillon de l'écran et le fichier écrit.

import sys 
import os 
import platform 
import subprocess 
import threading 
import pexpect 

hosts_file = open("hosts.txt","r") 
lines = hosts_file.readlines() 

for line in lines: 
    line = line.strip() 
    ping = subprocess.Popen(["ping", "-n", "3",line],stdout = subprocess.PIPE,stderr = subprocess.PIPE) 
    out, error = ping.communicate() 
    out = out.strip() 
    error = error.strip() 
    output = open("PingResults.txt",'a') 
    output.write(str(out)) 
    output.write(str(error)) 
    print(out.decode('utf-8')) 

    print(error.decode('utf-8')) 
hosts_file.close() 

écran est parfait

Pinging HOST7.foo [10.180.43.209] with 32 bytes of data: 
Reply from 10.180.43.209: bytes=32 time=81ms TTL=60 
Reply from 10.180.43.209: bytes=32 time=56ms TTL=60 
Reply from 10.180.43.209: bytes=32 time=56ms TTL=60 

Notepad ++ lit comme seule ligne visible \ r \ n (comme d'autres éditeurs

b'Pinging host7.foo [10.180.43.11] with 32 bytes of data:\r\nReply from 10.18.43.11: bytes=32 time=555ms TTL=60\r\nReply from 10.18.43.11: bytes=32 time=140ms TTL=60\r\nReply from 10.180.43.11: bytes=32 time=139ms TTL=60\r\n\r\nPing statistics for 10.180.43.11:\r\n Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),\r\nApproximate round trip times in milli-seconds:\r\n Minimum = 139ms, Maximum = 555ms, Average = 278ms'b''b'Pinging host9.foo [10.180.43.25] with 32 bytes of data:\r\nReply from 

Aidez-moi Obi-Wan Kenobie ... vous êtes mon seul espoir ...

+0

D'où vient l'entrée dans Notepad ++? ' – tripleee

+0

J'ouvre le fichier pingresults.txt avec notepad ++ – Seth

+0

Vous récupérez des octets (c'est ce que le 'b' ... '') signifie que vous avez DECODE dit octets sur l'entrée à votre programme et les ENCODE sur la sortie – bernie

Répondre

2

J'ai vérifié à nouveau ce code sur python 2.7 sur ubuntu et ça marche très bien avec l'addition de '\ n' ou os.linesep.

Sur python 3.2, subprocess.communicate renvoie un tableau d'octets. L'utilisation de out.decode() devrait convertir en une chaîne de caractères

.

[python 2.7 ci-dessous]

string.strip() supprime les caractères de fin de ligne par défaut.

"Hello\n".strip() 

rendements

'Hello' 

utilisation

output.write(str(out + '\n')) 

ou

output.write(str(out + os.linesep)) 

[python 3.X ci-dessous]

output.write(out.decode() + os.linesep) 
+0

Et si l'OP veut que les séparateurs de lignes restent comme si? – bernie

+0

croyez-moi. Je vais prendre ce que je peux obtenir en ce moment et ensuite corriger le format plus tard ... lol – Seth

Questions connexes