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
!lsWindows에서도 환경에 따라 다음처럼 사용할 수 있습니다.
!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. 셸을 닫는다따라서 pwd는 subfolder로 이동한 상태의 경로를 출력합니다.
하지만 중요한 점은 이 경우에도 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_name8. !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 pandas9. %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는 다음 셀에 유지되지 않으므로 작업 디렉터리 변경 용도로는 적합하지 않습니다.
폴더 목록 확인
운영체제 차이를 줄이고 싶다면 다음을 사용합니다.
%lsmacOS/Linux라면 다음도 가능합니다.
!lsWindows cmd 환경이라면 다음이 더 안전합니다.
!dirmatplotlib 그래프를 노트북 안에 표시
%matplotlib inline또는 최신 Jupyter 환경에서는 별도 설정 없이도 그래프가 표시되는 경우가 많습니다.
그래도 예제 재현성을 위해 다음 명령을 명시적으로 넣는 경우가 많습니다.
%matplotlib inline13. 전체 요약
%와 !의 차이는 다음 한 문장으로 정리할 수 있습니다.
%는 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 댓글