특정 Python 라이브러리가 설치되어 있는지 확인하기 위해 출력을 grep하려고 합니다 pip list
. 내가 이것을 시도하면
pip list | grep -q $package
,좋은 결과. 시도하면 pip list | grep -qi $package
다음과 같은 오류가 출력됩니다.
pi@pibox:~ $ pip list | grep -i -q pyyaml
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
load_entry_point('pip==1.5.6', 'console_scripts', 'pip')()
File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 248, in main
return command.main(cmd_args)
File "/usr/lib/python2.7/dist-packages/pip/basecommand.py", line 156, in main
logger.fatal('Exception:\n%s' % format_exc())
File "/usr/lib/python2.7/dist-packages/pip/log.py", line 111, in fatal
self.log(self.FATAL, msg, *args, **kw)
File "/usr/lib/python2.7/dist-packages/pip/log.py", line 164, in log
consumer.flush()
IOError: [Errno 32] Broken pipe
이것은 Python 측의 버그인 것 같습니다. 대소문자를 무시하는 grem 플래그가 파이프를 통해 정보를 보내는 pip의 기능과 어떤 관련이 있습니까?
이것은 Raspberry Pi 3 pip 1.5.6 from /usr/lib/python2.7/dist-packages (python 2.7)
및 grep (GNU grep) 2.20
.
답변1
이 -q
플래그를 사용하면 grep
데이터의 첫 번째 행이 일치할 때 프로그램이 즉시 중지됩니다.
하지만 pip
아마도 여전히 파이프로 데이터를 보내려고 시도하고 있을 것입니다. SIGPIPE를 받게 됩니다. 이로 인해 오류 추적이 발생합니다.
이 -i
플래그를 사용하면 프로세스가 grep
결과 쓰기를 완료하기 전에 더 빨리(이전 일치) 중지될 수 있습니다.pip
-q
일반적으로 반대쪽 프로그램이 SIGPIPE를 처리할 수 있는지 확신하지 않는 한 이와 같은 파이프라인에서는 사용하면 안 됩니다.
그래서 pip list | grep -i $packagename
그것은 잘 작동할 것입니다.