2014-03-05 5 views
1

표준 입력 또는 파일에서 데이터를 읽을 수있는 파이썬 스크립트가 있습니다. 이를 위해, 나는 다음과 같은 방식으로 fileinput를 사용 : 잘 작동fileinput 사용 후 raw_input 사용

for line in fileinput.input(args.path): 
    read.parseLine(line) 

합니다. 그러나이 파일/입력을 읽은 후, 본인은 사용하여 표준 입력을 통해 몇 가지 추가 입력을 사용자에게 문의 할 수 있도록하려면 :

data = raw_input("Please enter your data for port {}: ".format(core.getPort())) 

이 작동하지 않는, raw_input을이 EOF가 발생에 유지하기 때문이다.

Please enter your data for port 0: Traceback (most recent call last): 
    File "app_main.py", line 72, in run_toplevel 
    File "/usr/local/bin/dvm", line 98, in <module> 
    data = raw_input("Please enter your data for port {}: ".format(core.getPort())) 
EOFError 

나는 sys.stdin.seek(0)를 사용하여이 문제를 해결하려하지만 다음과 같은 오류 반환 :

Traceback (most recent call last): 
    File "app_main.py", line 72, in run_toplevel 
    File "/usr/local/bin/dvm", line 88, in <module> 
    sys.stdin.seek(0) 
IOError: [Errno 29] Illegal seek: '<fdopen>' 

fileinput 함수를 사용 후 사용자의 입력을 요청하는 방법은 없나요을?

답변

2

fileinputsys.stdin (읽기 제외) 이외의 어떤 것도 수행하지 않습니다 (명시 적으로 sys.stdin을 닫지 않도록합니다).

하지만 당신은 raw_input()에 대한 파일 입력 sys.stdin 모두와 사용할 수 없습니다; 파이프에 sys.stdin이 부착 된 경우, 또는이 사용자 터미널에 연결됩니다. 둘 다 연결할 수 없습니다. fileinput은 어떤 시점에서 파일 끝에 도달하지 않는 한 stdin에서 무한히 읽습니다.

즉, sys.stdin이 터미널에 연결되어 있지 않으면 raw_input을 사용할 수 없습니다.

if os.isatty(sys.stdin.fileno()): 
    # we have a terminal, I can use `raw_input()` 
+0

나는 그것을 실행 시간에 표준 입력의 대상을 변경하는 것은 불가능 같은데요 : 당신은 터미널을 사용할 수 있는지 감지 할 os.isatty() function을 사용할 수 있을까? – mathsaey

+0

@mathsaey : * 대상 *은 귀하의 스크립트입니다. 소스는 변경할 수 없습니다. 그것은 파이썬이 실행되기 전에 모두 설정됩니다. –

+0

stdin이 파이프에 바인딩되어 있다면 다른 방법으로 사용자 입력을 요청할 수 있습니까? – mathsaey