2009-01-21 9 views
11

próbuję coś jak toLądowanie Pythona w systemie Windows: Dlaczego to nie działa?

Output.py

print "Hello" 

Input.py

greeting = raw_input("Give me the greeting. ") 
print "The greeting is:", greeting 

Na cmd linii

Output.py | Input.py 

Ale zwraca EOFError. Czy ktoś może mi powiedzieć, co robię źle?

Dzięki za pomoc.

EDIT
Patrick Harrington solution działa, ale nie wiem, dlaczego ...

+0

Działa w języku Python 3.0. –

+0

To znaczy, użyłem wejścia (..) zamiast raw_input (..) –

+0

Zaktualizowałem swoją odpowiedź, aby wyjaśnić, dlaczego rozwiązanie zaproponowane przez Patricka i mnie proponujemy, a oryginał nie. – Jay

Odpowiedz

23

testowałem to na moim komputerze z systemem Windows i działa jeśli podasz exe Python:

C:\>C:\Python25\python.exe output.py | C:\Python25\python.exe input.py 
Give me the greeting. The greeting is: hello 

Ale otrzymuję również błąd EOFError, jeśli uruchomię polecenia bezpośrednio:

output.py | input.py 

Nie jestem do końca pewien, dlaczego tak jest, wciąż się nad tym zastanawiam, ale przynajmniej powinno to teraz zapewnić obejście problemu. Może to mieć coś wspólnego ze sposobem wywoływania obsługi plików dla plików .py.

UPDATE: cóż, co ty wiesz. Wygląda na to, że jest to błąd w systemie Windows, w którym przekierowanie stdin/stdout może nie działać poprawnie po uruchomieniu ze skojarzenia plików. Tak więc obejście to jest tak samo zauważone przeze mnie i Patricka, musisz określić "python", będzie on uruchamiał plik input.py, w przeciwnym razie nie przekieruje stdout z output.py do stdin dla input.py poprawnie.

referencyjny:

http://mail.python.org/pipermail/python-bugs-list/2004-August/024923.html

http://support.microsoft.com/default.aspx?kbid=321788

UPDATE 2:

Aby zmienić to zachowanie i uczynić Rury Okna działa zgodnie z oczekiwaniami Przekierowanie stdin/stdout, możesz dodać tę wartość do rejestru (przetestowane na moim pudełku i sprawdzone, że działa zgodnie z życzeniem).

  1. Uruchom Edytor rejestru.
  2. Zlokalizuj, a następnie kliknij następujący klucz w rejestrze:

    HKEY_LOCAL_MACHINE \ Software \ Microsoft \ Windows \ CurrentVersion \ Policies \ Explorer

  3. W menu Edycja kliknij polecenie Dodaj wartość, a następnie dodaj następującą wartość rejestru:

    nazwa

    wartość: InheritConsoleHandles typ
    Dane: RE G_DWORD
    Radix: dziesiętny
    Dane wartości: 1

  4. Zamknij Edytor rejestru.

+1

Warto wspomnieć, że teraz można dodać wartość 'InheritConsoleHandles' do rejestru systemu Windows, aby użyć polecenia' output.py | input.py', jak opisano na stronie połączonej witryny microsoft.com. – jfs

+0

Dobra racja, zrobi – Jay

4

go zmienić na:

Output.py | python Input.py 

wyjście będzie:

Daj mi powitanie. Powitanie jest: hello

+0

dlaczego to działa, ale pomijając pythona sprawia, że ​​nie działa? – Nope

+0

Zobacz moją odpowiedź z tego powodu, dlaczego to działa. – Jay

0

Oto dlaczego masz EOFError (od dokumentacji raw_input):

Funkcja odczytuje linię z wejściowych, zamienia go na ciąg (stripping końcowy znak nowej linii) i zwraca to. Po odczytaniu EOF podnosi się EOFError .

http://docs.python.org/library/functions.html?highlight=raw_input#raw_input

Możesz użyć sys.stdin, stanowi obiekt pliku, z którego można użyć do odczytu, readlines metod.

import sys 
for greeting_line in sys.stdin.readlines(): 
    print "The greeting is:", greeting_line.strip() 
Powiązane problemy