Python 설치부터 첫 실행과 오류 읽기
Python을 설치하고 파일을 저장해 실행한 뒤, 실행 결과와 오류 메시지에서 문제가 난 위치를 찾는 방법을 익힙니다.
알고리즘을 공부하다 보면 손으로 따라간 계산이 정말 맞는지 확인하고 싶은 순간이 자주 옵니다. 정렬하는 도중에 목록이 어떤 모습인지, 반복이 몇 번 도는지 같은 것들입니다. 이 교재는 그럴 때마다 짧은 Python 프로그램을 직접 실행해서 확인합니다. Python을 써 본 적이 없어도 괜찮습니다. 이 글에서는 Python을 설치하고, 파일을 저장해 실행하고, 오류가 났을 때 메시지에서 문제가 생긴 곳을 찾는 데까지 갑니다.
Python을 설치하고 명령 이름 확인하기
Python 공식 사이트에서 Python 3을 내려받아 설치합니다. 설치가 끝나면 터미널을 새로 열고, Python이 어떤 이름으로 실행되는지부터 확인합니다. 설치 전에 열어 둔 터미널은 새로 설치된 명령을 모를 수 있으므로 꼭 새 창에서 확인하세요.
python --versionPython 3.14.10버전 번호는 설치한 버전에 따라 다릅니다. 이 교재의 예제는 Python 3.14와 3.15에서 실행해 결과를 확인했습니다. Windows에서 python을 찾지 못한다는 오류가 나오거나 Microsoft Store 화면이 열린다면, 설치할 때 Python이 명령 경로(PATH)에 등록되지 않은 것입니다. 이때는 Windows용 Python에 함께 들어 있는 py --version을 시도해 봅니다. macOS와 Linux에서는 python3 --version을 씁니다.
셋 가운데 버전이 출력된 이름이 여러분의 Python 명령입니다. 이 교재의 명령은 모두 python으로 적었으니, 다른 이름이 맞다면 그 이름으로 바꿔 실행하면 됩니다.
파일 하나를 저장하고 실행하기
터미널(terminal)은 명령을 글자로 입력해 프로그램을 실행하는 창입니다. Windows에서는 PowerShell을, macOS와 Linux에서는 터미널 앱을 씁니다. 코드는 편집기(editor)로 파일에 적어 저장하고, 그 파일을 터미널에서 Python에 넘겨 실행합니다. 편집기는 파일 내용을 바꾸는 도구일 뿐이고 실행은 터미널에서 따로 일어난다는 점을 기억해 두면, 뒤에서 만날 혼란을 여러 번 피할 수 있습니다.
작업 폴더를 하나 만들고, 편집기에서 다음 세 줄을 lesson.py라는 이름으로 저장합니다.
total = 2 + 4
print("합계:", total)
print("준비 완료")편집기에 따라서는 이름 끝에 .txt가 자동으로 붙어 lesson.py.txt로 저장되기도 합니다. 파일 탐색기가 확장자를 숨기고 있으면 이름이 lesson.py처럼 보여서 알아차리기 어렵습니다. 저장할 때 파일 형식을 "모든 파일"로 고르거나, 탐색기에서 파일 확장명을 표시하도록 설정해 두면 이 실수를 막을 수 있습니다.
이제 터미널에서 cd 명령으로 작업 폴더로 이동한 뒤 파일을 실행합니다. 폴더 경로는 예시이니 실제로 만든 폴더로 바꾸세요. macOS와 Linux에서는 cd ~/algo처럼 적습니다.
cd C:\algo
python lesson.py합계: 6
준비 완료Python은 파일을 위에서 아래로 한 줄씩 실행합니다. 첫 줄은 오른쪽의 2 + 4를 먼저 계산하고, 그 결과인 6에 total이라는 이름을 붙입니다. 둘째 줄의 print는 괄호 안의 값을 화면에 보여 주는데, 값을 여러 개 주면 사이에 공백을 하나씩 넣어 출력합니다. 그래서 "합계:"와 total의 값 사이에 공백이 생겨 합계: 6이 됩니다. 마지막 줄까지 실행하고 나면 더 할 일이 없으므로 프로그램이 끝나고, 터미널은 다음 명령을 기다립니다.
파일을 더블클릭해서 실행하면 결과를 보여 주는 창이 바로 닫혀 버릴 수 있습니다. 결과와 오류 메시지를 읽으려면 이처럼 터미널에서 실행하세요.
>>>가 보이는 대화형 창
터미널에 파일 이름 없이 python만 입력하면 >>> 표시가 나타납니다. 이것은 대화형 모드(interactive mode)로, 한 줄을 입력할 때마다 바로 실행하고 결과를 보여 줍니다. 대화형 모드는 exit()를 입력하면 끝납니다.
>>> 2 + 4
6
>>> exit()대화형 모드에서는 2 + 4처럼 식만 적어도 값이 표시됩니다. 하지만 같은 줄을 파일에 적어 실행하면 아무것도 출력되지 않습니다. 대화형 모드는 식의 값을 자동으로 보여 주지만 파일을 실행할 때는 그러지 않기 때문입니다. 파일에서 값을 확인하려면 반드시 print를 써야 합니다. 책이나 웹 문서의 코드 앞에 붙은 >>>는 Python이 입력을 기다린다는 표시일 뿐이니, 코드를 파일로 옮길 때는 빼야 합니다.
오류 메시지는 마지막 줄부터 읽는다
이번에는 일부러 오류를 내 보겠습니다. lesson.py 둘째 줄의 total을 totla로 잘못 적고 다시 실행합니다.
total = 2 + 4
print("합계:", totla)
print("준비 완료")Traceback (most recent call last):
File "C:\algo\lesson.py", line 2, in <module>
print("합계:", totla)
^^^^^
NameError: name 'totla' is not defined. Did you mean: 'total'?이렇게 출력되는 오류 보고 전체를 트레이스백(traceback)이라고 부릅니다. 가장 중요한 정보는 마지막 줄에 있습니다. NameError는 오류의 종류이고, 그 뒤의 문장은 totla라는 이름이 정의된 적이 없다고 알려 줍니다. Python 3.10부터는 비슷한 이름이 있으면 Did you mean: 'total'?처럼 의도했을 법한 이름까지 짚어 줍니다.
마지막 줄에서 무엇이 잘못됐는지 알았다면 위로 올라가 어디서 났는지 봅니다. File "C:\algo\lesson.py", line 2는 lesson.py의 둘째 줄이라는 뜻입니다. 그 아래에 해당 줄의 코드가 있고, ^^^^^가 문제가 된 부분을 가리킵니다. 오류 메시지를 처음부터 끝까지 순서대로 읽기보다 이렇게 마지막 줄에서 시작해 위로 올라가는 편이 훨씬 빠릅니다.
눈여겨볼 점이 하나 더 있습니다. 이 오류는 파일을 읽자마자가 아니라, 둘째 줄을 실행하는 순간에 났습니다. 첫 줄의 total = 2 + 4는 정상적으로 실행됐고, 둘째 줄에서 totla를 찾다가 멈춘 것입니다. 첫 줄 앞에 print("시작")을 넣어 보면 이 순서가 그대로 드러납니다.
print("시작")
total = 2 + 4
print("합계:", totla)시작
Traceback (most recent call last):
File "C:\algo\lesson.py", line 3, in <module>
print("합계:", totla)
^^^^^
NameError: name 'totla' is not defined. Did you mean: 'total'?시작이 먼저 출력되고 나서 트레이스백이 나옵니다. 이처럼 실행하는 도중에 드러나는 오류를 실행 시간 오류(runtime error)라고 합니다. 확인이 끝나면 totla를 total로 되돌려 두세요.
문법 오류는 실행하기 전에 걸린다
오류가 모두 실행 도중에 나는 것은 아닙니다. 이번에는 마지막 줄의 닫는 괄호를 지워 봅니다.
total = 2 + 4
print("합계:", total)
print("준비 완료" File "C:\algo\lesson.py", line 3
print("준비 완료"
^
SyntaxError: '(' was never closed이번에는 Traceback으로 시작하는 줄이 없고, 앞의 두 줄이 멀쩡한데도 합계: 6이 출력되지 않았습니다. Python은 파일을 실행하기 전에 먼저 전체를 읽어 문장의 모양이 올바른지 검사하기 때문입니다. 괄호가 닫히지 않은 것처럼 문장 모양 자체가 틀리면 한 줄도 실행하지 않고 멈추는데, 이것을 문법 오류(SyntaxError)라고 합니다. 마지막 줄의 '(' was never closed는 여는 괄호가 끝내 닫히지 않았다는 뜻이고, ^는 그 여는 괄호를 가리킵니다.
괄호나 따옴표처럼 짝이 있는 기호를 빠뜨리면 Python은 파일을 끝까지 읽은 뒤에야 짝이 맞지 않는다는 것을 알 때가 있습니다. 그래서 문법 오류에서는 표시된 줄과 그 바로 앞 줄을 함께 살펴보는 습관이 도움이 됩니다.
고쳤는데 결과가 그대로일 때
편집기에서 코드를 고쳤는데 실행 결과가 바뀌지 않는다면, 대부분은 실행한 파일이 지금 보고 있는 파일과 다른 경우입니다. 먼저 저장했는지 확인합니다. 편집기 탭에 저장하지 않았다는 표시가 남아 있다면 Python은 예전 내용을 실행하고 있는 것입니다. 그다음 터미널이 어느 폴더에 있는지, 다른 폴더에 같은 이름의 파일이 있지는 않은지, 파일 이름이 lesson.py.txt는 아닌지 차례로 봅니다. 터미널이 엉뚱한 폴더에 있으면 Python이 파일을 찾지 못해 can't open file과 No such file or directory가 들어간 메시지를 냅니다.
앞으로 세게 될 것
이 프로그램은 입력이 없으므로 언제 실행해도 덧셈 한 번과 출력 두 번을 하고 끝납니다. 앞으로 다룰 알고리즘은 다릅니다. 정렬할 값이 10개일 때와 1,000개일 때 비교를 몇 번이나 하는지처럼, 입력의 크기에 따라 작업량이 어떻게 늘어나는지가 핵심 질문이 됩니다. 설치나 폴더 이동처럼 프로그램 밖에서 하는 일은 그 계산에 넣지 않습니다.
정리
- 설치한 뒤에는 새 터미널에서
python --version,py --version,python3 --version가운데 동작하는 이름을 찾고, 예제의python을 그 이름으로 바꿔 씁니다. - 코드는 편집기로 파일에 저장하고, 터미널에서
python 파일이름으로 실행합니다. Python은 위에서 아래로 실행하고 마지막 줄 뒤에 끝납니다. - 파일을 실행할 때는 식의 값이 자동으로 표시되지 않으므로
print로 출력합니다.print에 값을 여러 개 주면 공백으로 이어 보여 줍니다. - 오류 메시지는 마지막 줄의 종류와 설명부터 읽고, 위로 올라가 파일 이름과 줄 번호를 찾습니다.
NameError같은 실행 시간 오류는 앞줄을 실행한 뒤에 나고,SyntaxError는 한 줄도 실행하기 전에 납니다.
연습 문제
1. 계산 순서 예측하기
lesson.py의 첫 줄을 total = 2 + 4 * 3으로 바꾸면 합계: 뒤에 어떤 숫자가 나올지 실행하기 전에 예측해 보세요. 그다음 total = (2 + 4) * 3으로도 바꿔 비교합니다.
해설 보기
Python은 수학과 같이 곱셈을 덧셈보다 먼저 계산합니다. 2 + 4 * 3은 4 * 3을 먼저 계산한 12에 2를 더해 14가 됩니다. 괄호로 묶은 (2 + 4) * 3은 괄호 안을 먼저 계산하므로 6에 3을 곱한 18입니다.
print("합계:", 2 + 4 * 3)
print("합계:", (2 + 4) * 3)합계: 14
합계: 18계산 순서가 헷갈릴 때는 괄호를 쓰면 의도가 코드에 그대로 드러납니다.
2. 오류가 나기 전에 무엇이 출력될까
다음 두 파일을 각각 실행하면 어떤 오류가 나고, 오류가 나기 전에 무엇이 출력될까요? 실행하기 전에 먼저 예측해 보세요.
print("하나")
print(count)print("하나")
print("둘"해설 보기
first.py는 문장 모양이 올바르므로 실행이 시작됩니다. 첫 줄이 하나를 출력한 뒤, 둘째 줄에서 정의한 적 없는 count를 찾다가 NameError로 멈춥니다.
하나
Traceback (most recent call last):
File "C:\algo\first.py", line 2, in <module>
print(count)
^^^^^
NameError: name 'count' is not defined. Did you mean: 'round'?마지막 줄의 Did you mean: 'round'?는 이름이 비슷한 Python 내장 함수 round를 짐작해 보여 준 것입니다. 이 짐작은 철자가 가까운 이름을 고를 뿐이라 의도와 상관없을 때도 많습니다. 어떤 이름을 써야 했는지는 결국 코드를 보고 직접 판단해야 합니다.
second.py는 둘째 줄의 괄호가 닫히지 않았습니다. Python은 실행 전에 문장 모양을 검사하므로 첫 줄의 하나조차 출력하지 않고 SyntaxError로 멈춥니다.
File "C:\algo\second.py", line 2
print("둘"
^
SyntaxError: '(' was never closed같은 "오류로 멈춤"이라도 출력이 남았는지를 보면 실행 도중의 오류인지, 실행 전의 문법 오류인지 바로 구분할 수 있습니다.
다음 글 변수·조건·반복으로 상태 읽기에서는 값이 여러 번 바뀌는 프로그램을 한 단계씩 따라가며 읽습니다. Python 문법을 더 자세히 알고 싶다면 Python 공식 튜토리얼을 함께 보면 좋습니다.