2011-07-26 9 views
1

명령 프롬프트에서 사용자 입력을 얻으려고합니다. 프로그램은 "cat text.txt | ./thescript.py"의 방식으로 텍스트 파일에서 데이터를 읽습니다.raw_input()의 Python EOF 오류

해당 스크립트 시점에서 모든 데이터가 이미 읽혀지고 처리되고 저장됩니다 목록으로

이제 의심스러운 항목을 찾는 목록 목록을 반복합니다. 코드는 기본적으로 다음과 같습니다.

for invoice in parsedlist: 
     if invoice[-1] == 3: 
      sys.stderr.write("triple duplicate at " + invoice[2]+' : ' + invoice[3]+"\n") 
      sys.stderr.write("continue Y or N \n") 
      answer = raw_input("Type your answer here") 
      if answer == 'N': 
       sys.exit(1) 
      else: 
       pass` 

이 코드는 EOFError가됩니다. 내가 이미 이해 한 바로는, stdin은이 경우 고양이로부터의 읽기이며, 이미 EOF에 도달했기 때문에 raw_input이 EOF를 얻는 이유는 무엇입니까? (나는 생각한다) 스크립트가 표준 오류에 대한 경고를 출력하고 경고를 무시하고 계속 또는 완전히 종료할지 여부를 선택하도록하는 것이 목표입니다. 결국 모든 출력은 표준 출력으로 넘어 가고 오류 경고 또는 응답은 포함되지 않습니다. try/exception을 사용하는 예제를 보았지만이 컨텍스트에서이 예제를 이해하지 못했습니다. 예를 들어, raw_input이 입력을 기다리지 않는 이유는 무엇입니까?

저는이 문제를 잘못된 방식으로 공격하여 더 잘 걸려 넘어 질 수있는 문제를 일으킬 수 있다고 생각합니다. 어떤 도움도 언제나처럼 평가됩니다.

+0

들여 쓰기가 좋지 않습니다. 그들은 원래 존재했습니다. – Wyatt

+1

'cat text.txt | ./thescript.py'는 일반적으로 ./thescript.py

+0

그가 왼편을 단순화시키지 않으면 우리가 당면한 문제에서 우리를 혼란스럽게하지 않는다 ...;) –

답변

2

네, 문제는 raw_input()이 표준 입력에서 읽는 것입니다. 출력은 cat이며 EOF입니다.

내 제안은 cat을 제거하는 것입니다. 필요하지 않습니다. 파이썬은 독자적으로 파일을 완벽하게 읽을 수 있습니다. 명령 줄에서 파일 이름을 전달하고 열어 직접 읽습니다.

import sys 

for line in open(sys.argv[1]): 
    # process line 

당신이 fileinput 모듈을 체크 아웃, 여러 파일을 처리해야하는 경우

; 그들은 복수 파일을 마치 하나 인 것처럼 쉽게 처리합니다. 이는 cat이 당신을 위해하는 일입니다.

+0

나는 이것이 "걸어 다닐 줄 알았다"고 생각했다. 감사. 네가 말한 것처럼 분명해 보인다. 껍질은 부러지는 습관이 있습니다. :) – Wyatt

+0

'cat'은 쉘에서조차 나쁜 습관이 될 수 있습니다. 실제로 파일을 연결하지 않는 한 일반적으로 표준 입력을 파일로 재지 정하여 프로세스를 저장할 수 있습니다. 예 : '고양이 foo | grep bar '는 프로세스가 하나 밖에없는 경우를 제외하면'grep bar kindall

1

목적은 스크립트에 표준 오류에 대한 경고를 인쇄하고 경고를 무시하고 계속할지 또는 완전히 종료할지 선택하도록하는 것입니다.

데이터가 파일에서 오는 동안 대화 형 프롬프트에서 선택 하시겠습니까? 글쎄, 이제는 원래 프로그램과 다른 뭔가를하고있는 것입니다. 이전에 같은 장소에서 온 다른 장소에서 두 가지를 읽는 것입니다. 따라서이를 허용하도록 설계를 업데이트해야합니다.

왜 한 입력의 라인을 얻기 위해 필요한만큼의 입력에 대한

raw_input 대기를 raw_input을 기다리지 않습니다. 표준 입력이 파일에서 리디렉션되는 경우 입력 라인은 즉시 사용할 수 있습니다 (예 : 하드 디스크 속도로 제한됨). EOF가 끝나면 사용할 수 없게됩니다. 즉, 송장 데이터를 제공 할 때까지 기다리지 않는 것과 같은 이유 때문에 질문에 대한 답변을 기다리지 않습니다. 파일에서 리디렉션하면 더 이상 데이터 소스가 아니기 때문입니다.

이 (내가 python cons.py < cons.py를 실행하여 테스트 메시지가 표시 및 EOF에 대한 오류 얻을 수 있었다) 창에서 작동
3

: 당신은 아마 '교체해야 할 것 유닉스에서

import sys 

for line in sys.stdin: 
    print line 

sys.stdin = open('CON', 'r') 
q = raw_input('---->') 

을 CON '을/dev 디렉토리에 넣으십시오.