2013-02-17 2 views
0

현재의 무제한 Popen.stdout 개체에서 마지막 N 줄을 가져 오려고합니다. 무제한으로는 무제한/많은 로그 항목을 의미하며 표준 출력에 기록됩니다. Popen.stdout.readline()은 시간에 따라 제한적으로 시도했지만, 이는 거의 출력이없는 임의의 많은 문제를 생성합니다. 현재 출력의 일부 스냅 샷이 도움이되지만 그런 것을 찾을 수 없습니다. 내가 주로 발견하는 모든 해결책은 종료하는 외부 프로세스를위한 것이지만, 마지막 행을 읽은 후에 stdout에 쓸 수 있어야하는 서버 응용 프로그램입니다.무제한 Popen.stdout 개체에서 마지막 N 줄을 얻는 방법

인사말, 먼저 tail에 당신이 파이프 그것을 할 수있는 프로세스를 시작

Faerbit 유닉스에

+0

단순한 라이브러리 임에도 불구하고 과잉 공격 일 수 있습니다.이 작업에는 'pexpect'를 권하고 싶습니다. 적어도 stdout은 터미널처럼 보이지 않기 때문에 데이터의 전체 페이지를 버퍼링하는 서브 프로그램과 같은 문제를 해결합니다. –

+0

이것이 어떻게 도움이 될지 모르겠습니다. Popen이 가지고있는 것과 같은 것을 읽는 것과 같은 방법이있는 것 같습니다. (또한 그들의 웹 페이지는 매우 이상합니다.) – Faerbit

+0

'무제한'Popen이 의미하는 바를 명확하게 보여줄 수 있습니까? 그것은 당신이 끊임없이 로그 엔트리를 분출하는 웹 서버와 같은 Popen'ed 서브 프로세스를 가지고있는 것과 같은가? 그렇다면 제어 메인 프로세스에서 원하는대로 N 라인을 얻고 싶습니까? – sotapme

답변

0

:

p=subprocess.Popen("your_process.sh | tail --lines=3", stdout=subprocess.PIPE, shell=True) 
r=p.communicate() 
print r[0] 

shell=True의 사용법은 여기 열쇠입니다.

+0

키 문제가 없어서 작동하지 않습니다. 출력은 무제한입니다! tail뿐만 아니라 communicate()는 종료되는 프로세스에서만 작동합니다. 서버가 항상 실행 중이어야하기 때문에 서버 로그에이 기능이 작동하지 않습니다. – Faerbit

+0

마지막 N 줄은 무엇입니까? –

+0

파일에'tee'ing 출력을 고려해보고, 그 파일에 주기적으로'tail'을 실행합니다. 출력이 이미 로그 파일로 이동하면 로그 파일을'꼬리 '할 수 있습니다. –