명명 된 파이프에서 표준 입력 얻기


10

내가하려고하는 것은 터미널 창에서 파이썬을 실행하고 명명 된 파이프에서 stdin을 리디렉션하는 것입니다. 그런 다음 다른 터미널의 명명 된 파이프에 쓰고 해당 명령을 파이썬에서 실행합니다.

터미널 1:

mkfifo p1
python < p1

터미널 2:

echo -n "print \"Hello World\"" > p1

파이썬 프린트 Hello World가 종료됩니다. 내가하고 싶은 일은 다음 명령을 수행하기 위해 파이썬을 계속 실행하는 것입니다. 쉘에서 어떻게해야합니까?

답변:


10

당신은 필요

  • stdin이 터미널이 아니더라도 대화식으로 파이썬을 실행하십시오. python -i
  • 파이프의 쓰기 끝을 열어 두십시오. 그렇지 않으면 파이썬이 EOF를 감지하고 종료합니다.

그래서:

python -i < p1

그리고 다른 곳 :

exec 3> p1
echo '1j*1j' >&3
...
# and when done, close that file descriptor so python sees the EOF:
exec 3>&-

감사! 효과가있었습니다. 나는 당신이 한 일에 익숙하지 않습니다. 무슨 일이 일어나고 있는지 설명하기 위해 답변에 세부 사항을 추가 하시겠습니까? 무엇을 exec 3> p1하고 있고 &3& exec 3> &1무엇입니까? 감사합니다.
주님로.

1
귀하의 답변은이 배너 -sphotos-b.xx.fbcdn.net/hphotos-ash4/…를 상기시켜주었습니다 . 페이스 북에있는 친구의 표지 그림입니다 :-)
Lord Loh.

질문, 여기 exec 3>&-와 동일 하게 작동 exec 3>&1합니까?
와일드 카드

1
@Wildcard 3>&-여기 에 쓰려고 한 것 같습니다. 3>&1잘 작동하지만 거의 이해가되지 않습니다. 감사합니다
Stéphane Chazelas

5

쓰기 tail -f후 fifo를 열어 두는 데 사용할 수 있습니다 echo.

tail -n1 -f p1 | python

왜 이것이 작동 하는가

python에서 읽는 중입니다 p1. 파일 끝에 도달하면 읽기가 중지됩니다. 파일이 명명 된 파이프 인 경우에도 파일 읽기에 대한 정상적인 동작입니다. tail-f의 마지막에 도달 한 후 (후속) 플래그 파일 읽기 계속됩니다.


나는 echo "print \"Hello World\" " > p1두 번째 터미널에서 시도했지만 아무 일도 일어나지 않았지만 터미널도 차단되지 않았습니다. 파이썬이있는 터미널은 내가 끝날 때까지 차단 된 상태로 유지 ^c하고 종료하고 파이썬에 의해 키보드 인터럽트 메시지가 표시되면서 파이썬을 종료합니다.
주님로.

tail -f명명 된 파이프를 통해 블록 분할 타르 아카이브를 풀 때이 트릭을 사용했습니다 . 훌륭하게 작동했습니다.
Mael

2

전체 프로그램을 한 번에 보내야합니다.

run을 호출 python < p1하면 셸은 파이썬을 호출하기 전에 입력을 기다리고 있습니다. 즉, 파이썬은 전체 데이터 스트림이 쉘에 의해 읽히고 전체에 전달 될 때까지 전혀 실행 시작하지 않습니다 python.

심지어 실행 python -u p1(언 버퍼 및 파일에서 읽을입니다 대신 p1) python그것의 실행 전에 전체 파일을 읽으려고합니다.

이 실험을 시도하십시오.

터미널 1:

mkfifo p1
python < p1

터미널 2:

cat > p1
print "Hello World"
print "Hello World"

여러 줄을 보낼 수 있지만 용어 1의 파이썬은 아무것도하지 않습니다. 이제 ctrl+를 누릅니다 D. 전체 프로그램이 한 번에 실행됩니다.

요약하자면, 파이프에서 파이썬을 읽으려면 전체 프로그램을 보내야합니다. 이 방법으로 파이썬을 대화식으로 사용할 수 없습니다.


1

어쩌면 꼬리 접근 방식이 더 유연하지만 더 유연 할 수도 있습니다.

{ echo -n "print \"Hello World\""; cat; } > p1

원하는대로 작동하지 않습니다. -no가 제거되었을 수 있습니다. 그리고 그 후,와 0 터미널 echo명령은 내가 누를 때까지 1. 파이썬 명령을 실행하지 않습니다 차단됩니다 ^cecho단자와 두 프로세스를 종료.
주님로.

1
@LordLoh. 버퍼링 문제 일 수 있습니다. 아마도 파이썬은 충분한 출력이 만들어지면 첫 번째 줄이 마침내 FIFO에 기록되도록 명령을 실행합니다. 그러나 작동하는 솔루션이 있으므로이 문제를 해결하는 데 노력을 기울이는 것이 합리적이지 않습니다.
Hauke ​​Laging
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.