2011-11-29 3 views
1

가상 터미널을 실행하는 Python 프로그램을 작성 중입니다.어떻게 파이썬에서 터미널 출력을 실시간으로 읽습니까?

import pexpect, thread 

def create_input(child, scrollers, textlength=80, height=12): 
    while 1: 
     newtext = child.readline() 
     print newtext 

child = pexpect.spawn("bash", timeout=30000) 

thread.start_new_thread(create_input,(child)) 

이 작동하고, 나는 child.send(command) 통해 명령을 보낼 수 있습니다 : 현재 내가 너무처럼 시작하고있다. 그러나 전체 출력 만 출력됩니다. 즉, 나노 또는 링크와 같은 것을 실행하면 프로세스가 완료 될 때까지 출력이 수신되지 않습니다. 엔터를 눌러야 입력 내용을 볼 수 있습니다. bash가 출력 할 때 개별 문자를 읽을 수있는 방법이 있습니까?

+0

는 순간에 "라인 버퍼링"으로 나타나는 당신은 출력 "버퍼링"해야 할 것입니다. – chown

+0

어떻게 할 수 있습니까? – Skyler

답변

1

문제는 다른 것입니다. 대화 형 셸을 열면 일반적으로 bash, sh, csh 등을 실행하는 터미널 창이 열립니다. 터미널이라는 단어를보십시오!

옛날 우리는 터미널을 시리얼 포트 (telnet은 동일하지만 ip 이상), 다시 말하면 터미널에 연결했습니다.

심지어 더미 터미널 응답이 유형을보고하고, 대화 형 출력 서브 프로세스를 시작하는 등 커서의 위치, 색상, 명확한 화면 그래서

을 설정하는 코드를 esc 키,하지만 방법이 없다 bash 시작 매개 변수가있는 경우 셸 및 하위 프로세스가이 설정의 터미널에 있음을 알립니다.

로컬 호스트 (127.0.0.1) 에서만 telnetd를 사용하도록 설정하는 것이 좋습니다. 프로그램 내에서 소켓을 만들고 localhost : telnet에 연결하고 적절한 터미널을 에뮬레이트하는 방법을 찾으십시오. 프로그램이 라인 모드에 있다면 괜찮습니다. 그러나 전체 화면 편집으로 가면 어딘가에 80x24 또는 132x24 크기의 배열이나 문자를 저장할 크기가 필요합니다. 또한 배열에서 행을 위로 이동할 수 있어야합니다.

나는 보지 못했지만 파이썬에서 텔넷 클라이언트 예제가 없다고 상상할 수 없습니다. 터미널 에뮤도 있어야합니다!

또 다른 좋은 점은 IP 연결이 끊어지면 텔넷 세션이 정리되어 유령 프로세스가 제거된다는 것입니다.

마티

+0

귀하의 요구에 적합한 아이디어 일 수 있습니다. http://antony.lesuisse.org/software/ajaxterm/ Martijn – Martijn

2

bash가 실행중인 프로그램의 출력을 라인 버퍼링 대신 버퍼링하지 않도록 변경해야합니다. 좋은 양의 프로그램에는 버퍼링되지 않은 출력을위한 명령 행 옵션이 있습니다.

프로젝트에는 unbuffer이라는 도구가 있는데, 모든 bash 출력이 버퍼링되지 않은 것처럼 보입니다. 나는 그것을 개인적으로 사용한 적이 없지만, 여기에 다른 답변이 있으므로 추천해도 좋습니다 : bash: force exec'd process to have unbuffered stdout

+0

nano, 링크, vi 등을 제외하고는 작동합니다. 'Vim : 경고 : 출력이 터미널에 연결되어 있지 않습니다.' – Skyler

+0

@ user677624 음, 터미널이되는 "가짜"를 분류하는 방법이 있습니다. 그래서 그것은 vi/nano/etc와 함께 작동합니다 ... 나는 그것을 다시 발견하고 그것을 포함하려고 노력할 것입니다. – chown

+0

@ user677624'pexpect.spawn' 대신'os.system'을 사용하면 Vim에서이 작업을 할 수 있다고 말한 내용을 읽었지만 그 사실을 확인할 수는 없습니다. 좀 더 구체적인 것을 찾으려고 노력할 것입니다. – chown

관련 문제