2009-12-12 2 views
5

유닉스 커맨드 라인에서 파이썬 프로세스에 글을 쓰고 있습니다. EOF를 보내고 싶습니다 (또는 어떻게해서 stdin 버퍼를 플러시하여 파이썬이 입력을 읽을 수 있도록).EOF를 명령 행에서 Python sys.stdin으로 보내는 방법은 무엇입니까? CTRL-D가 작동하지 않습니다.

Ctrl-C를 누르면 KeyboardError가 발생합니다.

CTRL-D를 누르면 프로그램이 중지됩니다.

표준 버퍼를 어떻게 플러시합니까?

+2

Enter 키를 누르면 바로 입력이 파이썬에 전송됩니다. –

+0

작동 방식을 바꾸고 싶다면, 파이썬은 터미널 설정을 변경해야합니다. 이것은 검은 마법입니다 ... 아마도'termios' 모듈을 보십니까? http://docs.python.org/library/termios.html –

답변

1

'for l in sys.stdin'을 사용하면 버퍼링됩니다.

당신은 사용할 수 있습니다

while 1: 
    l = sys.stdin.readline() 
+0

어쨌든 버퍼링되었습니다. 둘 사이에는 차이가 없습니다. –

+0

사실, 위는 나를 위해 일했습니다. 메일 링리스트에서 sys.stdin.readline()이 아니라면 'sys.stdin'에서 여분의 내부 버퍼를 갖고 있다고 읽었습니다. –

+2

@JasonOrendorff : 실제로 [read-ahead buffer bug] (http://bugs.python.org/issue3907)로 인해 Python 2에서 차이점이 있습니다. 'iter in line (for sys.stdin.readline, '') :'을 사용하여 회피 할 수 있습니다. 'cat | python2 -u -c ""'을 사용하고 입력을 입력하십시오. 'readline()'변형은 라인을 즉시 사용할 수있게합니다. – jfs

11

제어-D이 프로그램이 "그만"해서는 안 -는 표준 입력을 닫아야하고, 그와 함께 프로그램 거래는 제대로, 그것은 완벽하게하면 계속하는 경우 그것은 필요합니다! 프로그램 -

import sys 

def main(): 
    inwas = [] 
    for line in sys.stdin: 
    inwas.append(line) 
    print "%d lines" % len(inwas), 
    print "initials:", ''.join(x[0] for x in inwas) 

if __name__ == '__main__': 
    main() 

우리가 볼 수있는 일

$ python st.py 
nel mezzo del cammin di nostra vita 
mi ritrovai per una selva oscura 
che la diritta via era smarrita 
3 lines initials: nmc 
$ 

같은 제어-D는 세 번째 행에 입력 한 후 바로 히트 경우 : st.py을 다음 주어진 예를 들어

, 표준 입력이 완료되었음을 인식하고 필요한 모든 후 처리를 수행합니다.

프로그램이 컨트롤 -D에서 조기에 종료되는 경우 잘못 코딩해야합니다. 문제의 편집에 대해 생각할 수있는 가장 작은 "오작동"프로그램을 추가하는 것은 어떨까요? 잘못된?

2

나는 무슨 일이 일어나고 있는지 알고 있다고 생각합니다. enter을 치지 않고 ctrl-D을 치고 있습니다. 프로그램에 줄을 보내려면 enter를 누르십시오. enter을 치지 않고 ctrl-D을 누르는 경우 ctrl-D을 다시 칠 수 있으며 프로그램에 다음 줄이 표시됩니다. 이 경우 (연속해서 두 개의 ctrl-D) 행의 끝에 개행 문자가 표시되지 않습니다. 예를 들어

,의 내가 파이썬 스크립트 a.py 있다고 가정 해 봅시다 :

import sys 

for line in sys.stdin: 
    sys.stdout.write('%s' % line) 

을 그리고 나는 그것을 실행합니다

$ python a.py 

을 그리고 다음을 입력 :

line 1 
line 2<ctrl-D><ctrl-D> 

프로그램 인쇄 할 것입니다 :

line 1 
line 2$ 

$은 쉘 프롬프트입니다. 위의 입력 내용과 전체 세션은 다음과 같습니다.

$ python a.평
라인 1
라인이 1 호선
라인이 $

( 굵게 프로그램의 출력. 로마의 경우 내가, 산세 두 ctrl-D의 입력 한 내용 표시하기위한 것입니다 보여줍니다)

이것이 일어나지 않는 경우, 현재 수행중인 작업에 대해 더 자세히 알려야합니다.

1
try: 
    # You might be inside the while-loop 
    foo = raw_input('Spam: ') # Or whatever... 
except EOFError: 
    print 'And now for something completely different.' 
    sys.exit()