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

 

Jupyter Notebook이나 Google Colab을 사용하다 보면 다음과 같은 명령어를 자주 보게 됩니다.

%pip install pandas
!pip install pandas

%pwd
!pwd

%cd subfolder
!cd subfolder

처음 보면 %!가 비슷해 보입니다. 둘 다 노트북 셀에서 명령어를 실행하는 것처럼 보이기 때문입니다.

하지만 실제로는 전혀 다른 방식으로 동작합니다.

핵심 차이는 다음과 같습니다.

구분 의미 실행 위치 상태 유지
% IPython 매직 명령어 현재 IPython/Jupyter 커널 일부 상태가 유지됨
! 시스템 셸 명령 실행 별도 셸 프로세스 기본적으로 유지되지 않음

1. %는 IPython 매직 명령어다

%로 시작하는 명령어는 Python 문법이 아니라 IPython이 제공하는 매직 명령어입니다.

대표적인 예시는 다음과 같습니다.

%pwd
%cd subfolder
%pip install pandas
%matplotlib inline

이 명령어들은 운영체제의 셸 명령이 아니라, IPython/Jupyter 커널이 특별히 해석해서 실행하는 명령입니다.

예를 들어 %pwd는 현재 Jupyter 커널의 작업 디렉터리를 반환합니다.

%pwd

출력 예시는 다음과 비슷합니다.

'C:\\Users\\username\\project'

따옴표가 붙어 보이는 이유는 %pwd가 단순히 화면에 문자열을 출력하는 것이 아니라, 현재 작업 디렉터리 경로를 Python 문자열 값처럼 반환하기 때문입니다.







2. !는 시스템 셸 명령어를 실행한다

!는 Jupyter Notebook 셀 안에서 운영체제의 셸 명령어를 실행할 때 사용합니다.

예를 들어 macOS나 Linux에서는 다음 명령이 동작합니다.

!pwd
!ls

Windows에서도 환경에 따라 다음처럼 사용할 수 있습니다.

!dir

하지만 Windows에서 !pwd, !ls가 항상 동작하는 것은 아닙니다.

그 이유는 pwd, ls가 기본적으로 Unix/Linux/macOS 계열에서 주로 사용하는 명령어이기 때문입니다. Windows PowerShell에서는 pwd, ls가 별칭으로 동작할 수 있지만, Jupyter가 실제로 어떤 셸을 통해 명령을 실행하는지에 따라 결과가 달라질 수 있습니다.

즉, 다음과 같은 차이가 발생할 수 있습니다.

명령어 macOS/Linux Windows cmd Windows PowerShell
!pwd 대체로 동작 실패 가능 동작 가능
!ls 대체로 동작 실패 가능 동작 가능
!dir 실패 가능 동작 동작 가능
%pwd 동작 동작 동작
%ls 대체로 동작 대체로 동작 대체로 동작

그래서 노트북에서 현재 폴더를 확인하려는 목적이라면 운영체제 차이를 덜 타는 %pwd를 사용하는 것이 더 안전합니다.


3. 왜 !cd subfolder 다음에 !pwd를 하면 폴더가 안 바뀔까?

가장 헷갈리는 부분은 cd 명령입니다.

예를 들어 다음 코드를 실행했다고 가정해 보겠습니다.

!cd subfolder
!pwd

많은 사람이 예상하는 결과는 subfolder로 이동한 뒤 현재 경로가 바뀌어 있는 것입니다.

하지만 실제로는 바뀌지 않는 경우가 많습니다.

이유는 ! 명령이 실행될 때마다 새로운 셸 프로세스가 열리고, 명령이 끝나면 바로 닫히기 때문입니다.

즉, 다음과 같은 흐름입니다.

1. 새 셸을 연다
2. cd subfolder 실행
3. 셸을 닫는다

4. 다시 새 셸을 연다
5. pwd 실행
6. 셸을 닫는다

그래서 첫 번째 !cd subfolder에서 폴더를 이동해도, 그 변화는 첫 번째 셸 안에서만 유효합니다. 셸이 닫히면 변경된 작업 디렉터리도 사라집니다.


4. !cd subfolder && pwd는 왜 동작할까?

반면 다음처럼 한 줄에 같이 실행하면 결과가 다르게 나옵니다.

!cd subfolder && pwd

이 경우에는 하나의 셸 안에서 두 명령이 순서대로 실행됩니다.

1. 새 셸을 연다
2. cd subfolder 실행
3. 같은 셸 안에서 pwd 실행
4. 셸을 닫는다

따라서 pwdsubfolder로 이동한 상태의 경로를 출력합니다.

하지만 중요한 점은 이 경우에도 Jupyter Notebook 자체의 작업 디렉터리가 바뀐 것은 아니라는 점입니다.

즉, 다음 셀에서 다시 !pwd를 실행하면 원래 위치가 나올 수 있습니다.


5. Jupyter Notebook의 작업 디렉터리를 실제로 바꾸려면 %cd를 사용한다

노트북 전체에서 작업 디렉터리를 바꾸고 싶다면 !cd가 아니라 %cd를 사용해야 합니다.

%cd subfolder

그다음 다음 명령어를 실행하면 변경된 위치가 유지됩니다.

%pwd

또는 Python 코드에서도 변경된 작업 디렉터리를 확인할 수 있습니다.

import os
os.getcwd()

정리하면 다음과 같습니다.

!cd subfolder

위 명령은 별도 셸 안에서만 폴더를 이동합니다.

%cd subfolder

위 명령은 현재 IPython/Jupyter 커널의 작업 디렉터리를 변경합니다.


6. %pwd!pwd 출력이 다르게 보이는 이유

macOS에서 다음 두 명령을 실행하면 둘 다 현재 경로를 보여줄 수 있습니다.

%pwd
!pwd

하지만 출력 모양이 다를 수 있습니다.

예를 들어 %pwd는 다음처럼 보일 수 있습니다.

'/Users/username/project'

반면 !pwd는 다음처럼 보일 수 있습니다.

/Users/username/project

이 차이는 출력 방식 때문입니다.

%pwd는 현재 경로를 IPython 매직 명령어가 반환한 값으로 보여줍니다. 그래서 Python 문자열처럼 따옴표가 붙어 보일 수 있습니다.

반면 !pwd는 운영체제 셸에서 출력한 텍스트를 그대로 보여줍니다.


7. %pip!pip의 차이

패키지 설치에서도 %!의 차이가 중요합니다.

%pip install

%pip install pandas

%pip은 현재 노트북 커널과 연결된 Python 환경에서 pip를 실행합니다.

즉, 현재 노트북에서 실제로 사용하는 Python 환경에 패키지를 설치하려는 목적이라면 %pip을 사용하는 것이 더 안전합니다.

Jupyter Notebook에서 가장 흔한 문제 중 하나는 다음과 같은 상황입니다.

!pip install pandas

설치는 성공한 것처럼 보이는데,

import pandas

를 실행하면 모듈을 찾을 수 없다고 나오는 경우입니다.

이런 문제는 !pip이 실행한 pip와 현재 노트북 커널이 사용하는 Python 환경이 서로 다를 때 발생할 수 있습니다.

그래서 노트북 안에서 패키지를 설치할 때는 다음 방식을 우선 권장합니다.

%pip install package_name

8. !pip install은 언제 사용해도 될까?

!pip install도 여전히 많이 사용됩니다.

!pip install pandas

이 방식은 셸에서 pip install pandas를 실행하는 것입니다.

Google Colab 예제나 오래된 Jupyter 예제에서는 !pip install을 자주 볼 수 있습니다. Colab에서는 일반적으로 잘 동작합니다.

다만 로컬 Jupyter 환경에서는 Python 환경이 여러 개일 수 있습니다.

예를 들어 다음과 같은 환경이 있을 수 있습니다.

base Python
venv Python
conda Python
Jupyter kernel Python

이때 !pip이 어느 Python의 pip를 가리키는지 헷갈릴 수 있습니다.

더 확실하게 하려면 다음처럼 현재 커널의 Python 실행 파일을 직접 사용해 pip를 실행할 수도 있습니다.

import sys
!{sys.executable} -m pip install pandas

하지만 요즘 IPython/Jupyter에서는 보통 다음이 더 간단합니다.

%pip install pandas

9. %matplotlib inline은 셸 명령어가 아니다

그래프 예제에서 자주 보이는 명령이 있습니다.

%matplotlib inline

이 명령은 matplotlib 그래프를 Jupyter Notebook 안에 바로 표시하도록 설정하는 IPython 매직 명령어입니다.

중요한 점은 이것이 셸 명령어가 아니라는 것입니다.

따라서 다음처럼 쓰면 안 됩니다.

!matplotlib inline

!matplotlib inline은 운영체제 셸에서 matplotlib이라는 실행 파일을 찾으려는 의미가 됩니다. 하지만 matplotlib은 보통 셸에서 직접 실행하는 프로그램이 아니라 Python 라이브러리입니다.

그래서 그래프 출력 설정은 %matplotlib inline처럼 % 매직 명령어로 사용해야 합니다.


10. Google Colab에서 !pip, %pip, $pip 차이

Google Colab에서도 패키지 설치는 일반적으로 다음 둘 중 하나를 사용합니다.

!pip install package_name

또는

%pip install package_name

둘 다 Colab에서 흔히 사용됩니다.

다만 정확히 구분하면 다음과 같습니다.

명령어 의미 권장도
!pip install package 셸에서 pip 실행 사용 가능
%pip install package 현재 커널 기준으로 pip 실행 더 권장
$pip 패키지 설치 명령이 아님 권장하지 않음

$pip%pip이나 !pip처럼 독립적인 패키지 설치 명령으로 이해하면 안 됩니다.

IPython/Jupyter에서 $는 주로 Python 변수 값을 셸 명령어 안에 넘길 때 사용됩니다.

예를 들어 다음처럼 사용할 수 있습니다.

filename = "data.csv"
!echo $filename

이 경우 $filename은 Python 변수 filename의 값으로 확장됩니다.

즉, $pip은 “Colab에서 pip를 실행하는 또 다른 방식”이 아닙니다. 패키지 설치는 %pip 또는 !pip을 사용하면 됩니다.


11. Colab에서 설치한 패키지는 영구적으로 유지될까?

Colab의 런타임은 가상 머신 위에서 실행됩니다.

따라서 !pip install이나 %pip install로 설치한 패키지는 현재 연결된 런타임에서는 사용할 수 있지만, 런타임이 초기화되거나 삭제되면 사라질 수 있습니다.

그래서 Colab 노트북에서는 보통 첫 번째 셀에 필요한 패키지 설치 코드를 넣어 둡니다.

%pip install pandas matplotlib seaborn

또는

!pip install pandas matplotlib seaborn

이렇게 해두면 런타임이 새로 시작되더라도 노트북을 위에서부터 실행하면서 필요한 패키지를 다시 설치할 수 있습니다.


12. 실무에서 추천하는 사용법

패키지 설치

Jupyter Notebook이나 Colab에서는 다음을 우선 사용합니다.

%pip install package_name

예시:

%pip install coolprop

현재 커널의 Python 환경에 설치하는 목적이라면 %pip이 가장 명확합니다.


현재 폴더 확인

%pwd

또는 Python 코드로 확인합니다.

import os
os.getcwd()

작업 폴더 변경

%cd subfolder

!cd subfolder는 다음 셀에 유지되지 않으므로 작업 디렉터리 변경 용도로는 적합하지 않습니다.


폴더 목록 확인

운영체제 차이를 줄이고 싶다면 다음을 사용합니다.

%ls

macOS/Linux라면 다음도 가능합니다.

!ls

Windows cmd 환경이라면 다음이 더 안전합니다.

!dir

matplotlib 그래프를 노트북 안에 표시

%matplotlib inline

또는 최신 Jupyter 환경에서는 별도 설정 없이도 그래프가 표시되는 경우가 많습니다.

그래도 예제 재현성을 위해 다음 명령을 명시적으로 넣는 경우가 많습니다.

%matplotlib inline

13. 전체 요약

%!의 차이는 다음 한 문장으로 정리할 수 있습니다.

%는 IPython/Jupyter 커널에 영향을 주는 매직 명령어이고, !는 별도 셸을 잠깐 열어 운영체제 명령을 실행하는 방식이다.

그래서 다음처럼 기억하면 됩니다.

목적 추천 명령어
패키지 설치 %pip install package_name
현재 폴더 확인 %pwd
작업 폴더 변경 %cd folder_name
운영체제 명령 실행 !command
그래프 인라인 표시 %matplotlib inline
한 셸 안에서 여러 명령 실행 !cd folder && pwd
Python 변수 값을 셸 명령에 전달 !echo $variable_name

가장 중요한 점은 !cd가 노트북의 현재 작업 디렉터리를 바꾸지 않는다는 것입니다.

!cd subfolder && pwd는 바뀐 것처럼 보이지만, 그것은 하나의 임시 셸 안에서만 일어난 변화입니다. 노트북 커널의 작업 디렉터리를 바꾸려면 반드시 %cd subfolder를 사용해야 합니다.

패키지 설치도 마찬가지입니다. 노트북에서 실제 사용하는 Python 환경에 설치하려면 !pip보다 %pip을 우선 사용하는 것이 좋습니다.

댓글 쓰기 · 수정

0 댓글