Windows의 Python Piping : 왜 이것이 작동하지 않습니까?
문제
나는 이런 것을 시도하고있다
output.py
print "Hello"
입력 .py
greeting = raw_input("Give me the greeting. ")
print "The greeting is:", greeting
CMD 라인에서
Output.py | Input.py
그러나 그것은 반환합니다 eoferror. 누군가 내가 뭘 잘못하고 있는지 말해 줄 수 있습니까?
당신의 도움을 주셔서 감사합니다.
편집하다
패트릭 해링턴 해결책 작동하지만 왜 그런지 모르겠습니다 ...
해결책
내 Windows 시스템에서 이것을 테스트했으며 Python exe를 지정하면 작동합니다.
C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py
Give me the greeting. The greeting is: hello
그러나 명령을 직접 실행하는 경우 다음과 같이 직접 동체가됩니다.
output.py | input.py
나는 그것이 왜 그런지 정확히 잘 모르겠습니다. 나는 여전히 이것을 조사하고 있지만 적어도 이것은 지금 당신에게 해결 방법을 제공해야합니다. .py 파일에 대한 파일 핸들러가 호출되는 방식과 관련이있을 수 있습니다.
업데이트: 글쎄, 당신은 무엇을 알고 있습니까? 이것은 실제로 파일 연관에서 시작했을 때 Stdin/stdout 리디렉션이 제대로 작동하지 않을 수있는 Windows의 버그 인 것 같습니다. 따라서 해결 방법은 나 자신과 Patrick에 의해 언급 된대로 "Python"이 input.py를 실행할 것을 지정해야합니다. 그렇지 않으면 stdout을 output.py에서 stdin으로 input.py로 올바르게 리디렉션하지 않습니다.
참조:
http://mail.python.org/pipermail/python-bugs-list/2004-august/024923.html
http://support.microsoft.com/default.aspx?kbid=321788
업데이트 2:
이 동작을 변경하고 Windows 파이프가 STDIN/STDOUT 리디렉션에 대해 예상대로 작동하도록하려면이 값을 레지스트리에 추가 할 수 있습니다 (내 상자에서 테스트하고 원하는대로 작동 함).
- 레지스트리 편집기 시작.
레지스트리에서 다음 키를 찾아서 다음 키를 클릭하십시오.
hkey_local_machine 소프트웨어 Microsoft Windows CurrentVersion Policies Explorer
편집 메뉴에서 값 추가를 클릭 한 다음 다음 레지스트리 값을 추가하십시오.
가치 이름 : 상인 컨 홀드
데이터 형식: reg_dword
RADIX : 소수점
가치 데이터 : 1레지스트리 편집기를 종료하십시오.
다른 팁
변경 :
Output.py | python Input.py
출력은 다음과 같습니다.
인사말을주세요. 인사말은 : 안녕하세요
다음은 eoferror를 얻는 이유입니다 (Raw_Input의 문서에서) :
그런 다음 함수는 입력에서 줄을 읽고 문자열로 변환 (후행 신형 줄무늬)로 변환하여 반환합니다. EOF가 읽히면 Eoferror가 제기됩니다.
http://docs.python.org/library/functions.html?highlight=Raw_Input#Raw_Input
사용하고 싶을 수도 있습니다 Sys.stdin, 읽기, 읽기 라인 메소드를 사용할 수있는 파일 객체를 제공합니다.
import sys
for greeting_line in sys.stdin.readlines():
print "The greeting is:", greeting_line.strip()