import platform
import sys
print("운영체제:", platform.system())
print("파이썬 버전:", sys.version)운영체제: Windows
파이썬 버전: 3.13.14 (tags/v3.13.14:fd17997, Jun 10 2026, 13:03:48) [MSC v.1944 64 bit (AMD64)]
7장에서 처음 터미널을 열었을 때를 떠올려 보세요. 익숙한 아이콘도 메뉴도 없이, 검은 화면에 커서만 깜빡였습니다. 마우스가 통하지 않는 세계라 낯설지만, 사실 이 책 전체에서 필요한 터미널 명령은 열 개가 되지 않습니다. 겁낼 분량이 아닙니다.
이 부록은 처음부터 끝까지 읽는 장이 아니라 사전입니다. 7장(모듈과 패키지)과 10장(argparse로 만드는 CLI)을 공부하다가 터미널에서 막히면, 여기로 돌아와 해당 항목만 찾아 읽으면 됩니다. 구성은 다섯 부분입니다. 용어와 세 환경(Windows PowerShell, macOS 터미널, Colab)의 대응 관계를 먼저 정리하고, 그다음 명령 사전, 경로 이야기, 파이썬과 터미널, 문제 해결 코너가 이어집니다.
한 가지만 미리 약속해 두겠습니다. 터미널 명령은 눈으로 읽어서는 늘지 않습니다. 각 항목의 예시 세션을 자기 컴퓨터에서 한 번씩 그대로 따라 치는 것, 그것이 이 부록의 올바른 사용법입니다.
세 단어가 자주 섞여 쓰이는데, 구분해 두면 오류 메시지를 읽을 때 도움이 됩니다.
터미널(terminal)은 글자로 명령을 주고받는 창 자체를 가리킵니다. 원래는 큰 컴퓨터에 연결된 입출력 단말기의 이름이었고, 지금 우리가 여는 것은 그 단말기를 흉내 내는 프로그램입니다. 셸(shell)은 그 창 안에서 여러분이 친 명령을 해석해 운영체제에 전달하는 통역 프로그램입니다. Windows의 기본 셸은 PowerShell, macOS의 기본 셸은 zsh입니다. 프롬프트(prompt)는 “명령을 입력하세요”라는 뜻으로 셸이 각 줄 앞에 표시하는 문자열입니다. 모양은 환경마다 다르지만, 현재 위치가 표시된다는 공통점이 있습니다.
PS C:\Users\hana> <- Windows PowerShell의 프롬프트
hana@MacBook-Air ~ % <- macOS 터미널(zsh)의 프롬프트
이 부록의 예시 세션에서 프롬프트가 보이면 “여기부터가 여러분이 입력하는 부분”이라는 표시입니다. 프롬프트 자체는 입력하지 않습니다. 예시를 통째로 복사하다가 PS C:\...>까지 함께 붙여 넣는 실수가 생각보다 흔합니다.
터미널을 여는 방법은 이렇습니다. Windows에서는 시작 메뉴에서 “PowerShell”을 검색하거나, 폴더 창의 빈 곳을 Shift를 누른 채 우클릭해 “여기에 PowerShell 창 열기”를 고릅니다. macOS에서는 Spotlight(Cmd+Space)에서 “터미널”을 검색합니다.
노트북에도 뒷문이 있습니다. Colab 코드 셀에서 줄 맨 앞에 !를 붙이면, 그 줄은 파이썬 코드가 아니라 셸 명령으로 실행됩니다. Colab이 빌려주는 클라우드 컴퓨터는 리눅스이므로, !pwd, !ls처럼 리눅스 명령을 그대로 쓰면 됩니다. 1장에서 !pwd를 쳐 봤던 것이 바로 이 기능이었습니다.
Windows 사용자를 위한 참고 하나. Windows에는 명령 프롬프트(cmd)라는 더 오래된 셸도 있지만, 이 책은 PowerShell을 기준으로 합니다. 다행히 PowerShell은 Windows식 명령(dir, copy, del)과 리눅스식 명령(ls, cp, rm)을 대부분 다 알아듣습니다. macOS나 Colab과 거의 같은 명령을 쓸 수 있다는 뜻이라, 외울 것이 줄어듭니다.
| 하는 일 | Windows PowerShell | macOS 터미널 | Colab 코드 셀 |
|---|---|---|---|
| 지금 위치 확인 | pwd |
pwd |
!pwd |
| 다른 폴더로 이동 | cd 폴더명 |
cd 폴더명 |
%cd 폴더명 |
| 폴더 내용 보기 | ls 또는 dir |
ls |
!ls |
| 새 폴더 만들기 | mkdir 이름 |
mkdir 이름 |
!mkdir 이름 |
| 파일 복사 | copy 원본 사본 (cp도 가능) |
cp 원본 사본 |
!cp 원본 사본 |
| 파일 삭제 | del 파일 (rm도 가능) |
rm 파일 |
!rm 파일 |
| 화면 지우기 | cls 또는 clear |
clear |
(메뉴에서 출력 지우기) |
| 파이썬 실행 | python |
python3 |
!python |
| 패키지 설치 | pip install 이름 |
pip3 install 이름 |
!pip install 이름 |
표에서 눈여겨볼 곳은 두 군데입니다. 첫째, macOS에서는 python이 아니라 python3, pip가 아니라 pip3입니다. 예전 macOS에 파이썬 2가 함께 들어 있던 역사 때문에 이름으로 세대를 구분하는 관행이 남았습니다. 둘째, Colab에서 유독 이동만 !cd가 아니라 %cd입니다. 왜 그런지는 명령 사전의 cd 항목에서 설명합니다.
사전을 펼치기 전에, 지금 이 노트북이 어떤 환경에서 돌고 있는지부터 확인해 두면 위 표에서 어느 열을 봐야 할지가 정해집니다. 아래 셀은 어느 운영체제에서든 안전하게 실행됩니다.
import platform
import sys
print("운영체제:", platform.system())
print("파이썬 버전:", sys.version)운영체제: Windows
파이썬 버전: 3.13.14 (tags/v3.13.14:fd17997, Jun 10 2026, 13:03:48) [MSC v.1944 64 bit (AMD64)]
지금부터 명령 하나마다 “무엇을 하는가 / 왜 필요한가 / 예시 세션 / 자주 하는 실수”의 순서로 정리합니다. 예시 세션은 Windows PowerShell 화면을 기준으로 하고, macOS에서 다르게 보이는 부분은 그때그때 함께 보입니다.
무엇을: 현재 작업 디렉터리(working directory)의 절대 경로를 출력합니다. print working directory의 약자입니다.
왜: 터미널의 모든 명령은 “지금 있는 위치”를 기준으로 동작합니다. python daily_profit.py가 파일을 찾을 수 없다고 답하는 원인의 절반은 파일이 없어서가 아니라, 내가 그 파일이 있는 폴더에 서 있지 않아서입니다. 길을 잃었다 싶으면 무조건 pwd부터입니다.
예시 세션:
PS C:\Users\hana> pwd
Path
----
C:\Users\hana
macOS에서는 한 줄로 나옵니다.
hana@MacBook-Air ~ % pwd
/Users/hana
자주 하는 실수: 실수라기보다 습관의 문제입니다. pwd는 아무것도 바꾸지 않는 완전히 안전한 명령이므로 아껴 쓸 이유가 없습니다. 명령이 이상하게 동작하면 원인 추리에 앞서 pwd를 치는 습관을 들이세요.
노트북 안에서도 같은 질문을 던질 수 있습니다. 아래 셀이 노트북 버전의 pwd입니다.
# 노트북에서 pwd에 해당하는 파이썬 코드
import os
print(os.getcwd())C:\Users\voidm\Master_project_hub\ECONO_000\.claude\worktrees\economics-python-curriculum-3aebeb
무엇을: 현재 작업 디렉터리를 바꿉니다. change directory의 약자입니다.
왜: 파이썬 스크립트를 실행하려면 보통 그 파일이 있는 폴더로 먼저 이동합니다. pwd로 위치를 확인하고, cd로 이동하고, ls로 도착지를 살피고, 그다음 본 명령을 실행하는 것이 터미널 작업의 기본 리듬입니다.
예시 세션:
PS C:\Users\hana> cd Desktop
PS C:\Users\hana\Desktop> cd econ_project
PS C:\Users\hana\Desktop\econ_project> cd ..
PS C:\Users\hana\Desktop> cd ~
PS C:\Users\hana>
한 줄씩 뜯어보기
cd Desktop — 현재 위치(C:) 바로 아래의 Desktop 폴더로 들어갑니다. 성공하면 아무 출력도 없습니다. 대신 다음 줄의 프롬프트가 바뀌어 있지요. 터미널에서는 “조용하면 성공”인 경우가 많습니다.cd econ_project — 한 단계 더 내려갑니다. 프롬프트가 곧 현재 위치이므로, pwd를 다시 치지 않아도 어디 있는지 보입니다.cd .. — ..은 “한 단계 위 폴더”를 뜻하는 특별한 이름입니다. econ_project에서 Desktop으로 되돌아왔습니다.cd ~ — ~는 내 홈 폴더의 별명입니다. 아무리 깊이 들어가 있어도 이 한 줄이면 홈으로 돌아옵니다.자주 하는 실수: 없는 폴더 이름을 대는 것입니다. PowerShell은 Set-Location : 'C:\Users\hana\desktop2' 경로는 존재하지 않으므로 찾을 수 없습니다.라고, macOS는 cd: no such file or directory: desktop2라고 답합니다. 원인은 대개 둘 중 하나입니다. 이름에 오타가 있거나, 그 폴더가 현재 위치 아래에 없거나. ls로 현재 위치의 폴더 목록부터 확인하세요.
실수 노트 — Colab에서 !cd가 말을 듣지 않습니다
Colab에서 !cd data를 실행한 뒤 !pwd를 쳐 보면 위치가 그대로입니다. ! 명령은 실행될 때마다 일회용 셸이 새로 만들어졌다가 사라지기 때문에, 그 안에서 이동해 봐야 셸이 사라지는 순간 이동도 함께 사라집니다. 이동만은 %cd data를 써야 합니다. %로 시작하는 매직 명령은 노트북 자신의 작업 위치를 바꾸므로 이동이 유지됩니다. 대응표에서 이동 칸에만 %가 붙어 있던 이유가 이것입니다.
무엇을: 현재 폴더 안의 파일과 하위 폴더 목록을 보여줍니다. PowerShell은 ls와 dir 둘 다 받고, macOS는 ls입니다.
왜: cd 다음에 반사적으로 치는 명령입니다. 파일 이름을 어렴풋이 기억한 채 명령을 치면 오타로 이어지므로, 눈으로 목록을 확인하고 정확한 이름을 보고 치는 편이 빠릅니다. 뒤에 나올 del/rm의 안전장치이기도 합니다.
예시 세션:
PS C:\Users\hana\econ_project> ls
Directory: C:\Users\hana\econ_project
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2026-03-02 오후 1:58 data
-a---- 2026-03-02 오후 2:10 412 daily_profit.py
-a---- 2026-03-02 오후 2:15 388 market.py
Mode 열이 d로 시작하면 폴더, 아니면 파일입니다. Length는 파일 크기(바이트)입니다. macOS는 이름만 간결하게 나열합니다.
hana@MacBook-Air econ_project % ls
daily_profit.py data market.py
자주 하는 실수: macOS에서 dir를 치면 command not found가 납니다. 반대 방향(PowerShell에서 ls)은 잘 되므로, 두 환경을 오가는 사람이라면 ls 하나로 통일하는 편이 기억할 것이 적습니다.
무엇을: 현재 위치에 새 폴더를 만듭니다. make directory의 약자입니다.
왜: 프로젝트마다 폴더 하나가 원칙입니다. 10장에서 econo CLI를 만들 때도 코드, 데이터, 결과를 폴더로 구분해 정리합니다. 바탕화면에 파일을 흩어 놓는 습관과 여기서 결별하게 됩니다.
예시 세션:
PS C:\Users\hana\Desktop> mkdir econ_project
Directory: C:\Users\hana\Desktop
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 2026-03-02 오후 1:57 econ_project
PS C:\Users\hana\Desktop> cd econ_project
PowerShell은 만든 폴더의 정보를 표로 보여주고, macOS는 아무 말 없이 만들고 끝냅니다. 만든 직후 cd로 들어가는 것까지가 한 묶음의 동작입니다.
자주 하는 실수: 이미 있는 이름으로 다시 만들면 “이미 있습니다” 계열의 오류가 납니다. 이 오류는 무해합니다. 이미 있으니 cd로 들어가면 그만입니다. 그보다는 공백이 든 이름(econ project)을 따옴표 없이 쓰는 쪽이 성가신 문제를 만듭니다. 자세한 사정은 경로 이야기 절에서 다룹니다.
무엇을: 파일을 다른 이름 또는 다른 폴더로 복사합니다. PowerShell은 copy(또는 cp), macOS는 cp입니다.
왜: 잘 돌아가는 스크립트를 고치기 전에 백업해 두는 것, 과제 제출 전에 사본을 만들어 두는 것. 복사는 실수의 보험입니다.
예시 세션:
PS C:\Users\hana\econ_project> copy market.py market_backup.py
PS C:\Users\hana\econ_project> ls
ls 결과에 market.py와 market_backup.py가 나란히 보이면 성공입니다. macOS에서는 cp market.py market_backup.py입니다. 폴더 안으로 복사할 때는 대상 자리에 폴더 이름을 씁니다. copy market.py backup\ (macOS: cp market.py backup/).
자주 하는 실수: 인자 순서입니다. 원본이 먼저, 사본이 나중입니다. 순서를 뒤집으면 백업으로 원본을 덮어쓰는, 정확히 반대의 사고가 납니다. 더구나 cp는 덮어쓸 때 묻지 않고 조용히 덮어씁니다. “원본 먼저”를 소리 내어 확인하는 버릇이 보험료보다 쌉니다.
무엇을: 파일을 지웁니다. PowerShell은 del(또는 rm), macOS는 rm입니다.
왜: 실험하다 생긴 임시 파일과 실패한 사본을 정리할 때 씁니다.
위험 — 이 명령에는 휴지통이 없습니다
폴더 창에서 지운 파일은 휴지통으로 가지만, del/rm으로 지운 파일은 그 즉시, 복구 수단 없이 사라집니다. 그래서 규칙 세 가지를 지킵니다.
- 지우기 전에 ls로 지울 파일의 이름을 눈으로 확인합니다.
- 한 번에 하나씩, 파일 이름을 정확히 지목해서 지웁니다.
*(모든 파일) 같은 와일드카드로 지우는 명령은 이 책에서 쓰지 않습니다.rm -r(폴더를 통째로 삭제)처럼 옵션이 붙은 삭제 명령은 그 뜻을 정확히 알기 전에는 입력하지 않습니다. 인터넷에서 복사해 온 명령에 rm이 섞여 있다면, 실행 전에 무엇을 지우는 명령인지 반드시 읽어 보세요.
예시 세션:
PS C:\Users\hana\econ_project> ls <- 지우기 전에 이름 확인
...(목록에서 old_test.py를 확인)...
PS C:\Users\hana\econ_project> del old_test.py
PS C:\Users\hana\econ_project> ls <- 지워졌는지 확인
자주 하는 실수: 없는 파일을 지우려 하면 “찾을 수 없습니다” 오류가 나는데, 이것은 무해합니다. 진짜 위험은 오류가 나는 경우가 아니라 잘못된 대상에 조용히 성공하는 경우입니다. 그래서 앞뒤로 ls를 치는 확인 절차가 붙습니다.
무엇을: 화면에 쌓인 출력을 지우고 프롬프트만 남깁니다. PowerShell은 cls와 clear 둘 다, macOS는 clear(단축키 Cmd+K)입니다.
왜: 순전히 시야 정리용입니다. 오류 메시지가 잔뜩 쌓여 정신이 없을 때 화면을 비우고 다시 시작하면 침착해집니다.
자주 하는 실수: 딱히 없습니다. 지워지는 것은 화면의 글자뿐이고 파일이나 데이터는 전혀 건드리지 않으므로, del과 헷갈리지만 않으면 마음 놓고 쳐도 되는 명령입니다.
무엇을: 파이썬을 실행합니다. 두 가지 얼굴이 있습니다. 이름만 치면 한 줄씩 대화하는 대화형 인터프리터(REPL)가 열리고, 뒤에 파일 이름을 붙이면 그 스크립트를 처음부터 끝까지 실행합니다.
왜: 이 책 터미널 트랙의 목적지입니다. 7장에서 모듈을 스크립트로 실행할 때, 10장에서 여러분이 만든 CLI를 실행할 때 모두 이 명령을 씁니다.
예시 세션 1 — 대화형:
PS C:\Users\hana> python
Python 3.12.4 (tags/v3.12.4:8e8a4ba, ...) on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 3000 * 120
360000
>>> exit()
PS C:\Users\hana>
>>>는 셸의 프롬프트가 아니라 파이썬의 프롬프트입니다. 나올 때는 exit()를 칩니다(macOS는 Ctrl+D, Windows는 Ctrl+Z 후 Enter로도 나올 수 있습니다).
예시 세션 2 — 스크립트 실행:
PS C:\Users\hana\econ_project> python daily_profit.py
오늘 이콘 카페 이익: 40,000원
자주 하는 실수: macOS에서는 python3라고 쳐야 하는 경우가 대부분입니다. “python을 찾을 수 없습니다”가 나오면 이 부록 끝의 문제 해결 코너를 보세요.
실수 노트 — 프롬프트를 잘못 골라 앉는 문제
터미널 초심자가 가장 자주 겪는 혼란은, 지금 내가 셸에게 말하는 중인지 파이썬에게 말하는 중인지를 놓치는 것입니다. >>>가 보이는 상태에서 셸 명령을 치면 이렇게 됩니다.
>>> pip install pandas
File "<stdin>", line 1
pip install pandas
^^^^^^^
SyntaxError: invalid syntax
pip는 셸 명령이지 파이썬 문법이 아니기 때문에 파이썬이 문법 오류라고 답한 것입니다. 반대로 셸 프롬프트에서 파이썬 코드를 치면 셸이 알아듣지 못합니다. 규칙은 하나입니다. >>>가 보이면 파이썬 문법만, PS ...>나 %가 보이면 셸 명령만. 어느 쪽인지 헷갈리면 exit()로 파이썬에서 빠져나온 뒤 프롬프트부터 확인하세요.
무엇을: 파이썬 패키지 저장소(PyPI)에서 패키지를 내려받아 설치합니다. pip install 이름으로 설치하고, pip list로 설치된 목록을 봅니다.
왜: matplotlib도 pandas도 파이썬에 처음부터 들어 있는 것이 아니라 pip로 설치하는 외부 패키지입니다. 표준 라이브러리 바깥의 도구는 전부 이 문을 지나 들어옵니다.
예시 세션:
PS C:\Users\hana> pip install koreanize-matplotlib
Collecting koreanize-matplotlib
Downloading koreanize_matplotlib-0.1.1-py3-none-any.whl
...
Successfully installed koreanize-matplotlib-0.1.1
PS C:\Users\hana> pip list
Package Version
-------------------- -------
koreanize-matplotlib 0.1.1
matplotlib 3.9.0
numpy 2.0.1
pandas 2.2.2
macOS에서는 pip3입니다. 이미 설치된 패키지를 다시 설치하면 Requirement already satisfied가 나오는데, 오류가 아니라 “이미 있어요”라는 확인입니다.
자주 하는 실수: 설치는 성공했는데 노트북에서 import가 안 되는 경우가 있습니다. 파이썬이 여러 벌 설치된 컴퓨터에서 pip는 A 파이썬에 설치했는데 노트북은 B 파이썬으로 돌고 있을 때 생기는 일입니다. 응급처치는 노트북 셀 안에서 !pip install 이름을 실행하는 것입니다. 그러면 노트북과 같은 파이썬에 설치됩니다. 근본 대책은 잠시 뒤 가상환경에서 이야기합니다.
실수 노트 — 설치할 때 이름과 import할 때 이름이 다릅니다
pip install koreanize-matplotlib으로 설치한 패키지를 코드에서는 import koreanize_matplotlib으로 불러옵니다. 하이픈(-)이 밑줄(_)로 바뀌었지요. 파이썬 문법에서 하이픈은 뺄셈 기호라서 이름에 쓸 수 없기 때문입니다. 같은 이유로 scikit-learn은 import sklearn으로 불러옵니다. ModuleNotFoundError: No module named 'koreanize-matplotlib' 같은 오류가 나면 철자보다 먼저 이 규칙을 의심해 보세요.
터미널 오류의 태반은 명령이 아니라 경로에서 나옵니다. 경로를 읽고 쓰는 감각만 잡아도 터미널 스트레스의 절반이 사라집니다.
절대 경로(absolute path)는 드라이브(Windows) 또는 루트 /(macOS)에서 시작하는 전체 주소입니다. C:\Users\hana\Desktop\econ_project\daily_profit.py처럼 어디서 읽어도 같은 곳을 가리킵니다. 상대 경로(relative path)는 지금 서 있는 위치를 기준으로 한 주소입니다. daily_profit.py, data\cafe_sales.csv, ..\backup\market.py 같은 것들이지요.
택배 주소에 비유하면 절대 경로는 도로명 전체 주소이고, 상대 경로는 “이 건물에서 옆 동 3층”입니다. 상대 경로는 짧아서 편하지만, 내가 어디 서 있느냐에 따라 가리키는 곳이 달라집니다. pwd가 중요한 이유가 바로 이것입니다. 같은 python daily_profit.py라도 어느 폴더에서 치느냐에 따라 성공하기도, 파일을 못 찾기도 합니다.
구분자도 다릅니다. Windows는 백슬래시 \, macOS·리눅스·Colab은 슬래시 /를 씁니다. PowerShell은 관대해서 /도 대부분 받아 주지만, macOS에서 \는 통하지 않습니다. 그래서 파이썬 코드 안에서는 어느 운영체제든 /로 쓰는 것이 안전하고, 이 책이 9장에서 "data/cafe_sales.csv"라고 쓰는 이유이기도 합니다.
셸은 공백을 “인자와 인자의 구분”으로 읽습니다. cd C:\Users\hana\바탕 화면이라고 치면 셸은 C:\Users\hana\바탕과 화면이라는 두 개의 인자를 받았다고 생각하고, 없는 폴더라며 거절하거나 엉뚱한 동작을 합니다. 해법은 경로 전체를 따옴표로 감싸는 것입니다.
PS C:\Users\hana> cd "C:\Users\hana\바탕 화면\경제 자료"
한글 폴더 이름 자체는 요즘 환경에서 대부분 문제없지만, 오래된 프로그램이나 일부 패키지가 한글 경로에서 오류를 내는 일이 아직 있습니다. 실습 폴더는 econ_project처럼 공백 없는 영문 이름으로 만들기를 권합니다. 한 가지 더, OneDrive가 바탕화면을 관리하는 Windows 컴퓨터라면 바탕화면의 실제 경로가 C:\Users\hana\OneDrive\바탕 화면처럼 한 겹 더 깊을 수 있습니다. 파일이 안 보이면 pwd와 ls로 실제 구조부터 확인하세요.
긴 경로를 손으로 끝까지 치는 사람은 반드시 오타를 냅니다. 앞 몇 글자만 치고 Tab 키를 누르세요. 셸이 나머지를 채워 줍니다. PowerShell은 Tab을 누를 때마다 후보를 하나씩 돌아가며 보여주고, macOS(zsh)는 후보가 하나로 정해지면 채워 주며 여럿이면 한 번 더 눌렀을 때 목록을 보여줍니다.
자동완성에는 오타 방지 이상의 쓸모가 있습니다. 셸은 실제로 존재하는 이름만 채워 줍니다. Tab을 눌렀는데 아무것도 채워지지 않는다면, 그 이름으로 시작하는 파일이 현재 위치에 없다는 뜻입니다. 자동완성이 오타 검사기 노릇까지 하는 셈이지요.
경로를 파이썬 코드 안에서 조립할 일도 곧 생깁니다(9장의 read_csv가 대표적입니다). 파이썬 표준 라이브러리 pathlib을 쓰면 운영체제에 상관없이 같은 코드로 경로를 다룰 수 있습니다.
# 노트북에서 경로 다루기: pathlib
from pathlib import Path
here = Path.cwd() # pwd에 해당
print("현재 위치:", here)
print("한 단계 위:", here.parent) # cd .. 가 가리키는 곳
print("데이터 파일 경로:", here / "data" / "cafe_sales.csv")현재 위치: C:\Users\voidm\Master_project_hub\ECONO_000\.claude\worktrees\economics-python-curriculum-3aebeb
한 단계 위: C:\Users\voidm\Master_project_hub\ECONO_000\.claude\worktrees
데이터 파일 경로: C:\Users\voidm\Master_project_hub\ECONO_000\.claude\worktrees\economics-python-curriculum-3aebeb\data\cafe_sales.csv
7장의 핵심 장면은 노트북 밖에서 파이썬을 실행하는 것이었습니다. 그 장면을 이루는 부품들을 여기서 하나씩 정리합니다.
절차는 세 단계입니다. 메모장이나 VS Code로 코드를 .py 파일로 저장하고, 터미널에서 그 파일이 있는 폴더로 cd한 뒤, python 파일명.py를 칩니다.
PS C:\Users\hana\econ_project> python daily_profit.py
오늘 이콘 카페 이익: 40,000원
노트북과 스크립트는 성격이 다릅니다. 노트북은 셀 단위로 대화하듯 실행하지만, 스크립트는 위에서 아래로 한 번에 끝까지 달립니다. 그리고 스크립트에서는 print() 하지 않은 값은 화면에 나오지 않습니다. 노트북이 셀 마지막 값을 알아서 보여주던 친절은 노트북만의 것입니다.
이 과정을 노트북 안에서 그대로 재연해 볼 수 있습니다. 7장에서 배운 %%writefile로 파일을 만들고, %run으로 실행해 보겠습니다.
%%writefile daily_profit.py
# 이콘 카페의 하루 이익을 계산하는 스크립트
price = 3000 # 아메리카노 한 잔 가격 (원)
cups = 120 # 하루 판매량 (잔)
fixed_cost = 200000 # 하루 고정비 (원)
unit_cost = 1000 # 잔당 재료비 (원)
profit = price * cups - (fixed_cost + unit_cost * cups)
print(f"오늘 이콘 카페 이익: {profit:,}원")Writing daily_profit.py
파일이 생겼으니 실행합니다. %run은 터미널에서 python daily_profit.py를 치는 것과 같은 일을 노트북 안에서 해 주는 매직 명령입니다.
%run daily_profit.py오늘 이콘 카페 이익: 40,000원
사장님이 가격을 3,200원으로 올리면 어떻게 될까요. 스크립트 파일을 열어 숫자를 고치는 방법도 있지만, 실행하는 순간에 값을 건네는 방법이 있습니다. 명령줄 인자(command-line argument)입니다. 파이썬 쪽에서 이 값을 받는 창구가 sys.argv라는 리스트입니다.
%%writefile daily_profit_args.py
# 가격과 판매량을 명령줄 인자로 받는 버전
import sys
price = int(sys.argv[1]) # 첫 번째 인자: 가격
cups = int(sys.argv[2]) # 두 번째 인자: 판매량
fixed_cost = 200000
unit_cost = 1000
profit = price * cups - (fixed_cost + unit_cost * cups)
print(f"가격 {price:,}원, {cups}잔 기준 이익: {profit:,}원")Writing daily_profit_args.py
한 줄씩 뜯어보기
import sys — 명령줄 인자는 sys 모듈의 argv라는 리스트에 담겨 도착합니다.sys.argv — 실행 명령 전체를 공백 기준으로 자른 문자열 리스트입니다. 터미널에서 python daily_profit_args.py 3200 130이라고 치면 sys.argv는 ['daily_profit_args.py', '3200', '130']이 됩니다. 0번 칸은 항상 스크립트 이름이고, 우리가 건넨 값은 1번부터 들어갑니다.int(sys.argv[1]) — 숫자를 쳐서 건넸어도 인자는 문자열로 도착합니다. 2장에서 본 대로 '3200'과 3200은 다르므로, int()로 바꿔야 곱셈에 쓸 수 있습니다.터미널이라면 python daily_profit_args.py 3200 130이라고 칠 자리입니다. %run도 같은 방식으로 인자를 건넬 수 있습니다.
%run daily_profit_args.py 3200 130가격 3,200원, 130잔 기준 이익: 86,000원
코드를 한 글자도 고치지 않고 다른 상황을 계산할 수 있다는 것이 인자의 힘입니다. 비 오는 날 손님이 95잔으로 줄면 어떻게 될까요.
%run daily_profit_args.py 3000 95가격 3,000원, 95잔 기준 이익: -10,000원
이익이 음수, 즉 하루 만원의 손실입니다. 고정비 20만 원은 손님이 줄어도 그대로 나가기 때문입니다. 스크립트는 그대로인데 인자만 바꿔 시나리오를 넘나든 것에 주목하세요.
인자가 두세 개를 넘어가면 순서를 기억하기 어려워지고, 값이 빠졌을 때의 안내문도 직접 만들어야 합니다. 그 일을 대신해 주는 표준 라이브러리가 argparse이고, 10장의 주인공입니다. 인자마다 이름과 설명을 붙일 수 있고, --help를 치면 사용법 안내가 자동으로 생깁니다.
실습에서 만든 두 파일은 지우고 갑니다. os.remove()는 del/rm의 파이썬판입니다. 역시 휴지통이 없으므로, 파일 이름을 정확히 지목해서 지웁니다.
import os
os.remove("daily_profit.py")
os.remove("daily_profit_args.py")
print("임시 스크립트 2개를 지웠습니다.")임시 스크립트 2개를 지웠습니다.
오류에 대해 도움을 청할 때 첫 문장은 늘 환경 설명이어야 합니다. “안 돼요”만으로는 아무도 도울 수 없습니다. 버전을 확인하는 명령은 이렇습니다.
PS C:\Users\hana> python --version
Python 3.12.4
PS C:\Users\hana> pip --version
pip 24.0 from C:\Users\hana\AppData\Local\...\pip (python 3.12)
PS C:\Users\hana> pip list
Package Version
-------------------- -------
matplotlib 3.9.0
numpy 2.0.1
pandas 2.2.2
pip --version의 출력에는 이 pip가 어느 파이썬 소속인지까지 나옵니다. “설치했는데 import가 안 돼요” 문제를 조사할 때의 출발점입니다. Colab에서는 아래처럼 !를 붙여 같은 것을 확인합니다.
!python --version
!pip listColab에서 위 셀을 실행하면 대략 이런 출력이 나옵니다(버전 숫자는 접속 시점에 따라 다릅니다).
Python 3.11.13
Package Version
---------------------- -----------
matplotlib 3.10.0
numpy 2.0.2
pandas 2.2.2
...
Colab에는 이 책에서 쓰는 주요 패키지가 이미 설치되어 있어서, 목록이 수백 줄로 깁니다.
이런 상황을 상상해 보세요. A 과목 과제는 예전 버전 pandas로 쓰인 코드를 돌려야 하고, B 과목 과제는 최신 버전이 필요합니다. 컴퓨터 전체에 pandas를 한 벌만 설치할 수 있다면 두 과제를 오갈 때마다 설치와 삭제를 반복해야 합니다. 가상환경(virtual environment)은 이 문제를 프로젝트 폴더마다 독립된 패키지 세트를 두는 방식으로 해결합니다. 공용 실험대 하나를 다 같이 쓰는 대신, 프로젝트마다 자기 실험 트레이를 갖는 셈입니다.
1학년 실습에서 필수는 아닙니다. Colab은 접속할 때마다 새 환경을 받으므로 애초에 이 문제가 없습니다. 다만 나중에 “이 프로젝트용 가상환경을 만드세요”라는 안내를 만났을 때 당황하지 않도록, 최소 명령만 적어 둡니다.
PS C:\Users\hana\econ_project> python -m venv .venv <- 만들기 (한 번만)
PS C:\Users\hana\econ_project> .venv\Scripts\Activate.ps1 <- 켜기 (Windows)
(.venv) PS C:\Users\hana\econ_project> pip install pandas <- 이 환경에만 설치
(.venv) PS C:\Users\hana\econ_project> deactivate <- 끄기
macOS에서 켜는 명령은 source .venv/bin/activate입니다. 켜져 있는 동안 프롬프트 앞에 (.venv)가 붙습니다. 지금 어느 환경에 있는지 프롬프트가 말해 주는 것이지요. Windows에서 켜는 순간 “이 시스템에서 스크립트를 실행할 수 없으므로”라는 오류가 나면, PowerShell에서 Set-ExecutionPolicy -Scope CurrentUser RemoteSigned를 한 번 실행하고 다시 시도하면 됩니다.
터미널에서 자주 만나는 네 가지 곤경과 빠져나오는 길입니다.
증상은 이렇습니다. Windows PowerShell에서는
python : 'python' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는
프로그램의 이름으로 인식되지 않습니다.
macOS에서는 zsh: command not found: python.
원인을 이해하려면 PATH를 알아야 합니다. 셸은 명령 이름을 받으면 PATH라는 폴더 목록을 순서대로 뒤지며 그 이름의 프로그램을 찾습니다. 이 목록에 파이썬이 설치된 폴더가 없으면, 설치가 되어 있어도 셸은 찾지 못합니다. 없는 것이 아니라 못 찾는 것입니다.
해결 순서는 이렇습니다. 첫째, macOS라면 python3로 다시 시도하세요. 대부분 여기서 해결됩니다. 둘째, Windows라면 py를 시도하세요. py 런처는 PATH와 무관하게 등록되는 경우가 많습니다. 셋째, 그래도 안 되면 파이썬을 다시 설치하되, 설치 첫 화면의 “Add python.exe to PATH” 체크박스를 반드시 켜세요. 이 체크박스가 이 문제의 예방주사입니다. 넷째, 어디에 설치되어 있는지 직접 확인하려면 Windows는 where.exe python, macOS는 which python3를 칩니다.
지금 이 노트북이 돌아가고 있다면 적어도 하나의 파이썬은 확실히 있습니다. 그 정확한 위치를 물어보는 코드는 이렇습니다.
# 지금 이 노트북이 쓰는 파이썬의 정확한 위치
import sys
print(sys.executable)C:\Users\voidm\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\python.exe
python daily_profit.py의 출력이 ì´ìµ 같은 외계 문자로 나오면 인코딩 문제입니다. 글자를 바이트로 저장하고 읽는 방식(인코딩)이 파일과 콘솔에서 서로 다를 때 생깁니다. 파이썬은 UTF-8을 기본으로 쓰는데, 오래된 Windows 콘솔은 CP949라는 다른 방식을 쓰기 때문입니다.
C:\Users\hana> chcp 65001
활성 코드 페이지: 65001
65001은 UTF-8의 코드페이지 번호입니다. 이 명령은 특히 명령 프롬프트(cmd)에서 필요하고, 최신 Windows Terminal과 PowerShell에서는 대부분 손대지 않아도 잘 나옵니다. 함께 확인할 것이 하나 더 있습니다. .py 파일 자체가 UTF-8로 저장되어 있는지입니다. VS Code는 창 오른쪽 아래에 현재 파일의 인코딩을 표시하며 기본값이 UTF-8이므로, 메모장 대신 VS Code를 쓰면 이 걱정이 줄어듭니다. macOS와 Colab은 처음부터 UTF-8이라 이 문제가 거의 없습니다.
이 메시지의 뜻은 “명령은 알아들었지만 권한이 없다”입니다. 흔한 경우는 세 가지입니다.
첫째, 그 파일을 다른 프로그램이 붙잡고 있는 경우입니다. Excel로 열어 둔 csv 파일을 지우거나 덮어쓰려 할 때 Windows에서 자주 겪습니다. 그 프로그램을 닫으면 풀립니다. 둘째, 시스템 폴더(C:\Program Files, /usr 등)에 쓰기를 시도한 경우입니다. 실습 파일을 시스템 폴더에 둘 이유는 없으니, 내 사용자 폴더(Documents나 Desktop 아래 실습 폴더)에서 작업하면 애초에 만날 일이 없습니다. 셋째, macOS에서 인터넷 안내문이 명령 앞에 sudo를 붙이라고 하는 경우입니다. sudo는 관리자 권한으로 강제 실행한다는 뜻인데, 뜻을 모른 채 붙이는 습관은 위험합니다. 이 책의 실습 범위에서 sudo가 필요한 일은 없습니다.
PS C:\Users\hana> phyton daily_profit.py
phyton : 'phyton' 용어가 cmdlet, 함수, 스크립트 파일 또는 실행할 수 있는
프로그램의 이름으로 인식되지 않습니다.
셸의 오류 메시지 첫머리에는 셸이 이해하지 못한 단어가 따옴표에 싸여 그대로 인용됩니다. 그 단어가 검사 지점입니다. 명령 이름이 인용되었다면 명령의 오타(또는 방금 본 PATH 문제)이고, 경로가 인용되었다면(“…경로는 존재하지 않으므로…”) 경로의 오타나 현재 위치의 문제입니다. 위 예시라면 인용된 phyton을 소리 내어 읽는 순간 python의 오타임이 보입니다. “셸이 못 알아들은 단어를 소리 내어 읽는다” — 셸 오류 독해법의 거의 전부입니다. 한편 파이썬 자체의 오류(Traceback)를 읽는 법은 성격이 달라서, 부록 B가 통째로 그 이야기를 맡습니다.
이 부록의 연습문제는 노트북이 아니라 실제 터미널에서 합니다. 문제마다 체크리스트가 붙어 있으니, 모든 항목에 표시할 수 있으면 통과입니다.
연습 A-1. 내 위치 읽기
터미널을 열고 pwd를 실행하세요. 출력된 절대 경로를 구분자 단위로 끊어서, 각 부분이 무엇을 뜻하는지 말로 설명해 보세요.
연습 A-2. 실습 폴더 만들기
홈 폴더 아래에 econ_practice 폴더를 만들고 그 안으로 이동하세요.
연습 A-3. 스크립트 저장하고 실행하기
메모장이나 VS Code로 hello_econ.py 파일을 econ_practice 안에 만드세요. 내용은 아메리카노 가격과 판매량으로 총수입을 출력하는 print 한두 줄이면 충분합니다. 저장한 뒤 터미널에서 실행하세요.
연습 A-4. 안전한 복사와 삭제
hello_econ.py의 백업본을 만들었다가, 안전 절차를 지켜 삭제하세요.
연습 A-5. 환경 보고서 만들기
누군가에게 도움을 청하는 상황을 가정하고, 내 환경을 요약한 세 줄을 만들어 보세요. 운영체제와 셸, 파이썬 버전, 주요 패키지 버전이 들어가야 합니다.
다섯 문제의 예시 세션(입력과 예상 출력)은 부록 C에 있습니다.
터미널은 글자로 컴퓨터를 조작하는 창이고, 그 안에서 명령을 해석하는 프로그램이 셸입니다. 모든 명령은 현재 작업 디렉터리를 기준으로 동작하므로, 길을 잃으면 pwd로 위치를 확인하고 cd로 이동하며 ls로 주변을 살피는 것이 기본 리듬입니다. 만들고 복사하는 명령은 부담 없이 써도 되지만, del과 rm에는 휴지통이 없다는 사실만은 몸에 새겨 둘 필요가 있습니다. python 명령은 대화형 인터프리터와 스크립트 실행이라는 두 얼굴을 갖고, sys.argv로 명령줄 인자를 받으면 코드를 고치지 않고도 실행할 때마다 다른 값을 다룰 수 있습니다. 문제가 생기면 오류 메시지에 인용된 단어를 소리 내어 읽는 데서 시작하고, 도움을 청할 때는 –version과 pip list로 내 환경부터 설명합니다. 이 부록은 사전이니 여기서 외우려 들지 말고, 7장과 10장을 지나며 막힐 때마다 다시 펼치면 됩니다. 터미널 너머에서 파이썬이 내놓는 오류 메시지, 즉 Traceback을 읽는 법은 부록 B가 이어받습니다.