2014-04-30 3 views
1

저는 파이썬에 대한 중요한 멍청한 행동입니다. 그러나 시스코 등에서 CLI를 많이 사용해보십시오. 나는 Python을 'go to'스크립트 도구로 만들기로 결정했다. 그리고 글쎄, 난 비참하게도 코드의 대부분을 훔쳐 내 첫 시도를 실패했습니다 ... r n은 텍스트 파일에 문자열로 표시됩니다.

나는 호스트 목록의 핑을하고있다. 목적은 1. 유효성을 검사하는 것입니다. 2. IP를 얻으십시오.

온라인으로 얻은 스크립트는 버전 3.4를 약간 수정 한 후에 작동합니다.

디스플레이가 원하는대로 완벽하게 표시됩니다. 그것이 쓰는 파일은 단지 텍스트의 일부로 쓰여진 \ r \ n을 가진 것처럼 보이는 하나의 긴 줄입니다. 이것은 코드와 스크린 디스 플레이 및 작성된 파일의 샘플입니다. 다른 편집기처럼

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

화면 (

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 

메모장 ++ 볼 수 \ 연구 \ n 인 줄로 읽어 완벽

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 

도와 오비완 Kenobie ... 너는 내 유일한 희망이야 ...

+0

메모장에서 입력이 끝나는 위치 ++? – tripleee

+0

메모장을 사용하여 pingresults.txt 파일을 엽니 다. ++ – Seth

+0

다시 바이트를 가져옵니다 (즉, 'b'... ')는 의미가 있습니다. DECODE는 프로그램에 입력 할 때 바이트를 말하고 나가는 도중 엔코 드를 수행합니다. – bernie

답변

2

우분투의 Python 2.7에서이 코드를 다시 확인했는데 '\ n'또는 os.linesep을 추가하면 정상적으로 작동합니다.

파이썬 3.2에서 subprocess.communicate는 바이트 배열을 반환합니다.

out.decode()를 사용하면이를 문자열로 변환해야합니다.

[파이썬 이하 2.7]

string.strip()는 기본적으로 광고 자의 단부를 제거한다.

"Hello\n".strip() 

복귀

'Hello' 

사용

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

또는

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

[이하 파이썬 3.X]

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

OP가 라인 구분 기호를 남기고 싶다면 어떻게해야합니까? 그대로? – bernie

+0

나를 믿어 라. 내가 그 순간에 얻을 수있는 것을 취해서 나중에 형식을 고쳐 줄거야. LOL – Seth