2015-01-14 5 views
0

파이썬을 사용하여 tcpdump를 실행하여 휴대 전화에서 일부 검사 요청을 캡처합니다. 지금은 콘솔에 인쇄 중입니다.파이썬 하위 프로세스가 모든 행을 출력하지 않습니다.

def dumpNexus(self): 
     proc = subprocess.Popen(["sudo", "tcpdump", "-i", "mon.wlan0", "-e", "-s", "0", "type", "mgt", "subtype", "probe-req", "and", "ether host", "bc:f5:ac:f2:xx:xx"], stdout=subprocess.PIPE,) 
     for line in iter(proc.stdout.readline,''): 
      print proc.stdout.readline() 

내 문제는 내가이 프로그램을 실행하면, 그것은 tcpdump에 의해 작성되고있는 모든 라인을 인쇄 할 것입니다.
tcpdump 명령을 실행하고 해당 출력을 파이썬 프로그램과 비교하면 파이썬 프로그램의 표시되는 패킷 수가 훨씬 적습니다.

tcpdump는 28 개 패킷을 포착 만 (11)이 구성 프로세스 stdout 통해 출력되는 것을 명시한다.

왜 이런 생각입니까? -l 플래그를 사용 -

덕분에

+1

그럼 당신이 전화하는거야'의 readline()'두 번, 당신은 무엇을 기대를? –

+0

그냥 인쇄 라인 –

답변

1

이 같은 뭔가를 당신이 "라인 버퍼 모드"로 tcpdump을한다고 생각합니다.

+0

나는 이것이 내가 찾고있는 것이라고 생각해! 지금 잘 작동하고있는 것 같습니다. 고맙습니다. – user2413192

3

문제는 두 번 readline()를 호출하는 것입니다. 내부 처음으로 iter의 내부와 루프의 내부 그래서 iter에 의해 반환 된 라인을 무시 무시.

for line in iter(proc.stdout.readline, ''): 
    print line 

또는 당신은 간단하게 수행 할 수 있습니다 : 수정 사항이 될 것입니다

for line in proc.stdout: 
    print line 
+0

알았어. 그건 분명히 문제 였어. 모든 줄 바꿈을 두 배로 피하기 인쇄 명령문의 끝 ('sys.stdout.softspace' 해킹)에 쉼표를 추가 : (- 쉼표 <)'인쇄 라인,'당신에게 – user2413192

+0

user2413192 @ 감사합니다. for line in proc.stdout'은 [Python 2의 숨겨진 미리 읽기 버그] (http://bugs.python.org/issue3907)로 인해 출력이 지연되고'iter (proc.stdout.readline, b '')'대신. [Python : subprocess.communicate()에서 스트리밍 입력 읽기] (http://stackoverflow.com/a/17698359/4279)를 참조하십시오. – jfs