colab:: jupyter shell command ( !pip vs %pip ) 차이

 

 

 

 

Google Colab에서 !pip과 $pip의 차이점

Google Colab에서 파이썬 패키지를 설치하는 데 사용할 수 있는 두 가지 주요 명령어는 !pip$pip입니다. 하지만 각 명령어는 작동 방식과 결과에 있어 몇 가지 중요한 차이점이 있습니다.
1. 명령어 실행 환경:
  • !pip: !pip 명령어는 쉘 명령어로 실행됩니다. 즉, Colab 노트북 내에서 쉘 명령을 실행하는 것과 동일한 기능을 합니다.
  • $pip: $pip 명령어는 Colab 노트북 내의 Python 코드 셀에서 실행됩니다. 즉, 일반적인 Python 코드와 동일한 방식으로 실행됩니다.
2. 영구성:
  • !pip: !pip으로 설치된 패키지는 영구적이지 않습니다. Colab 노트북 세션을 종료하거나 런타임을 다시 시작하면 설치된 패키지가 삭제됩니다.
  • $pip: $pip으로 설치된 패키지는 영구적일 수 있습니다. 하지만 Colab 버전에 따라 다릅니다.
    • Colab Pro: $pip으로 설치된 패키지는 영구적으로 유지됩니다.
    • Colab 무료 버전: $pip으로 설치된 패키지는 다음 경우에 삭제될 수 있습니다.
      • Colab 노트북 세션을 종료합니다.
      • 런타임을 12시간 이상 사용하지 않고 유휴 상태로 둡니다.
      • Colab 런타임이 자동으로 다시 시작됩니다.
3. 사용 권장:
  • 일회성 패키지 설치:
    • !pip:
      • 특정 작업을 위해 일회성으로만 필요한 패키지를 설치할 때 유용합니다.
      • 예: 데이터 세트 로드, 특정 분석을 위한 라이브러리 설치 등
    • $pip:
      • 영구성이 보장되지 않기 때문에 일회성 패키지 설치에는 권장되지 않습니다.
  • 영구 패키지 설치:
    • !pip:
      • 영구성을 원하더라도 !pip을 사용할 수는 있지만, 런타임 종료 또는 재시작 시 패키지가 삭제될 가능성이 있으므로 주의해야 합니다.
    • $pip:
      • Colab Pro 사용자의 경우 영구 패키지 설치에 $pip 사용을 권장합니다.
      • Colab 무료 버전 사용자의 경우, 런타임 종료 또는 재시작 시 패키지가 삭제될 수 있음을 인지하고, 영구성이 중요한 패키지는 다른 방법 (예: Google Drive에 패키지 복사 및 로드)을 사용하는 것을 고려해야 합니다.
4. 기타 고려 사항:
  • root 권한: !pip 명령어는 root 권한으로 실행되므로 시스템 레벨 변경을 일으킬 수 있습니다. 주의해서 사용해야 합니다.
  • 버전 관리: $pip 명령어는 버전 관리 도구 (예: pipenv, virtualenv)와 함께 사용하여 설치된 패키지의 특정 버전을 관리할 수 있습니다.
5. 결론:
  • !pip$pip은 각각 장단점이 있으며, 상황에 따라 적절한 명령어를 선택해야 합니다.
  • 영구성이 중요한 패키지 설치에는 Colab Pro 사용자는 $pip 사용을 권장하고, Colab 무료 버전 사용자는 다른 방법을 고려해야 합니다.
  • root 권한 및 버전 관리와 같은 추가 기능도 고려해야 합니다

 

 

 

 

 


 

뭔 소리일까.... 제대로 이해 못함.


 
 
 
 
 
windows jupyter에서는 현재 폴더를 표시하는 pwd 명령어가

  • %를 사용했을 때 정상적 표현
  • !를 사용하면 에러메세지와 함께 실행불가  (stackoverflow찾아봐도 조치 방법 안 나옴)

 
 
 
macbook으로 동일한 파일을 옮겨서 테스트, 두 명령어 모두 정상적으로 표기 

  • %pwd :: 주소표시 양쪽 끝에 ' ' string type으로 표시하는 것인지 차이 있음
  • !pwd :: 주소만 표시 

 
 
 
 
명령어가 운영체제(OS)에 따라서 동작여부가 달라지나 싶어서
windows에서 테스트
- mkdir 명령어로 폴더 하나 만들어 봄. >> 생성완료
- cd 명령어로 해당폴더로 이동 >> !pwd 명령어 찍어 봄 >> 폴더 안보임 >> !ls로 찍어봄 >> 안 보임
  (** windows에서도 powershell 사용하면 ls명령어로 cmd에서의 dir명령어와 동일하게 나옴)
- %pwd , %ls 명령어로 똑같이 찍어 봄 >> shell output 잘 나옴
- 그런데, cd subfolder를 했는데 "Coolpropnotebooks/subfolder" 가 아닌 "Coolpropnotebooks"폴더가 표시됨

 
 
 
 
macbook에서
- mkdir , cd subfolder 명령어 정상적으로 동작함 >> success 표시 뜸
- windows에서 실행 안되는 것처럼 보이던 pwd로 동작함 
- 동일하게 폴더 변경은 안됨
- 그래서, 명령어 실행 완료 후 이어서 실행하는 "&&" 문구로 cd subfolder와 pwd 실행하면 변경됨
 
; windows vs macos 운영체제의 차이가 아님

 
 
그래서 1개의 shell에서  1번째줄 !cd subfolder , 2번째줄 !pwd 해 봄
폴더 변경 안됨

 
 
 
 
처음에 gpt 설명을 봐도 정확히 이해를 못 했는데, 가만히 보니

GPT설명의 마지막 부분

  • ! 명령어를 사용하면 각 줄의 명령어가 os.subprocess / 새 프로세스에서 마치  (새 shell 창 열고 실행하고 창 닫고 ) 를 반복하는 것이 되는 것이라 jupyter notebook명령어가 있는 해당 프로세스 / shell 자체에는 변화가 없는 것이고
  • % 명령어를 사용하면 jupyter notebook을 실행하는 프로세스에서 shell commands를 실행하니 cd subfolder가 먹히는 것처럼 보이는 것임
  • 그래서 !cd subfolder && pwd를 한번에 실행하면 '새로운 창 열고 >> cd subfolder 실행하고 >> pwd로 폴더 이름 보여주고 >> 창 닫힘' 순으로 process가 진행되니 폴더가 변경된 결과물 보여주고 CLOSE shell이라 결과물이 달라지는 것임

 
 
왜 이렇게 까지 찍어보느냐 하면
jupyter notebook에서 다른 것들은 크게 아쉬움이 없는데 그래프 그리는 예제 보면 %matplotlib 명령어를 써야 할 때가 자주 있음. 그런데... "%" vs " ! " 제대로 설명해 둔 곳이 없더라고,,, 그래서 !matplotlib이나 뭔가 다른 명령어를 썼을 때 적용이 안되곤 했었는데,, 그 원인이 이런 shell 명령어의 차이로 발생하는 것이라 추정됨

%matplotlib inline은 인라인 플롯을 활성화하는... (위 GPT설명에서 발췌)

 
 
 
 
 
 
 
_

반응형