To, co próbuję zrobić, to uruchomić python w oknie terminala i przekierować go stdin z nazwanego potoku. Następnie piszę do nazwanego potoku w innym terminalu i uruchamiam to polecenie w Pythonie.
Terminal 1:
mkfifo p1
python < p1
Terminal 2:
echo -n "print \"Hello World\"" > p1
Co się dzieje - python drukuje Hello World
i wychodzi. Chcę, aby Python działał, aby wykonać następne polecenie. Jak to zrobić w powłoce?
exec 3> p1
robi i co jest&3
&exec 3> &1
? Dziękuję Ci.exec 3>&-
działałoby tak samo jakexec 3>&1
tutaj?3>&-
tutaj pisać .3>&1
działałby również, ale nie miałby sensu. DziękiMożesz użyć,
tail -f
aby utrzymać fifo otwarte poecho
zapisaniu do niego.Dlaczego to działa
python
czyta zp1
. Gdy osiągnie koniec pliku, przestaje czytać. Jest to normalne zachowanie w przypadku odczytu pliku, nawet jeśli plik jest nazwanym potokiem.tail
z-f
flagą (Follow) będzie kontynuować czytanie z pliku po osiągnięciu jego końca.źródło
echo "print \"Hello World\" " > p1
na drugim terminalu i nic się nie stało - ale terminal również nie został zablokowany. Terminal z pythonem pozostawał zablokowany, dopóki^c
go nie zamknąłem i nie wychodziłem z niego oraz kończę python, wyświetlając komunikat przerwania klawiatury.tail -f
sztuczki podczas rozpakowywania archiwum tar z podziałem bloków przez nazwaną potok. Działa cudownie.Musisz wysłać cały program na raz.
Po wywołaniu polecenia run
python < p1
powłoka czeka na dane wejściowe przed wywołaniem Pythona. Oznacza to, że pyton nie rozpocząć wykonywanie wcale aż cały strumień danych został odczytany przez powłokę, a następnie są przekazywane w całości dopython
.Nawet uruchomienie
python -u p1
zamiast tego (tzn. Niebuforowanego i odczytanie z plikup1
)python
spróbuje odczytać cały plik przed wykonaniem dowolnego z nich.Wypróbuj ten eksperyment.
Terminal 1:
Terminal 2:
Zobaczysz, że możesz wysłać wiele linii, ale python w Term 1 nic nie robi. Teraz naciśnij ctrl+ D. Cały program wykonuje się jednocześnie.
Podsumowując, jeśli chcesz, aby Python czytał z potoku, musisz wysłać cały program. W ten sposób nie można używać Pythona interaktywnie.
źródło
Być może podejście ogona jest lepsze (bardziej elastyczne), ale alternatywnie:
źródło
-n
mógł zostać usunięty. A potem, 0. Terminal zecho
poleceniem zostanie zablokowany 1. pyton nie wykonuje polecenia do pędzę^c
wecho
terminalu i zarówno proces zakończyć.