상위 목록: 하위 목록: 작성 날짜: 읽는 데 8 분 소요

Python 실행

제 1강에서 설치한 Python 인터프리터는 우리가 작성한 코드를 받아 실행하는 프로그램입니다. 이번 강좌에서는 인터프리터에게 코드를 전달하는 방법과, 여러 줄의 코드를 파일로 저장하여 하나의 프로그램(프로젝트)으로 실행하는 방법을 알아봅니다.

Python 코드는 크게 두 가지 방법으로 실행할 수 있습니다.

  • 대화형 셸(REPL) : 코드를 한 줄씩 입력하면 즉시 실행하고 결과를 보여줍니다.
  • 스크립트 파일 : 코드를 .py 파일로 저장한 뒤 한 번에 실행합니다.

간단한 계산이나 기능 확인은 대화형 셸에서, 여러 줄로 구성된 프로그램은 스크립트 파일로 작성합니다.

두 방법 모두 같은 인터프리터가 코드를 바이트코드로 변환하여 실행한다는 점은 같습니다. 차이는 코드를 얼마만큼씩 받아 실행하는가와 결과를 자동으로 보여주는가에 있습니다.

구분 대화형 셸(REPL) 스크립트 파일
실행 단위 입력한 문장 하나(또는 블록 하나) 파일 전체
값 출력 표현식의 값을 자동으로 출력 print()로 출력한 것만 표시
저장 종료하면 입력한 코드가 사라짐 파일로 남아 다시 실행 가능
용도 실험, 계산, 기능 확인 프로그램 작성



대화형 셸(REPL)

대화형 셸은 코드를 한 줄 입력할 때마다 바로 실행 결과를 돌려주므로, 처음 배우는 문법이나 함수의 동작을 즉시 확인하기에 좋습니다. 계산기처럼 사용할 수도 있습니다.

터미널(명령 프롬프트, PowerShell 등)에서 python을 입력하면 대화형 셸이 실행됩니다.

python

Windows에서는 py, macOS와 Linux에서는 python3를 입력해도 됩니다.

REPL은 Read(읽기) - Eval(실행) - Print(출력) - Loop(반복)의 약자로, >>> 프롬프트에 코드를 입력하면 Compile과 Link 없이 바로 실행됩니다.

REPL이라는 이름은 대화형 셸이 동작하는 순서를 그대로 나타냅니다.

  1. Read : >>> 프롬프트를 보여주고 사용자가 입력한 코드를 읽습니다.
  2. Eval : 읽은 코드를 바이트코드로 변환하여 실행합니다.
  3. Print : 실행한 코드가 값을 가지는 표현식이고 그 값이 None이 아니라면 값을 출력합니다.
  4. Loop : 다시 >>> 프롬프트를 보여주고 1번으로 돌아갑니다.
>>> test = "076923"
>>> test
'076923'
>>> print(test)
076923
>>> 3 + 4
7

대화형 셸에서는 print()를 사용하지 않아도 표현식의 값이 바로 출력됩니다. 단, 문자열은 따옴표가 포함된 형태로 표시됩니다.

위 예제를 한 줄씩 읽어 보면 다음과 같습니다.

  • test = "076923" : 변수에 값을 대입하는 문장(Statement)이므로 값이 없어 아무것도 출력되지 않습니다.
  • test : 변수 이름만 입력한 표현식(Expression)이므로 값을 출력합니다. 이때는 값을 코드로 적는 형태('076923')로 보여주므로 따옴표가 붙습니다.
  • print(test) : print()가 문자열의 내용만 화면에 출력하므로 따옴표 없이 076923이 표시됩니다.
  • 3 + 4 : 계산 결과 7이 출력됩니다.

따옴표가 붙어 있는지로 값이 문자열인지 숫자인지 구별할 수 있으므로, 대화형 셸의 자동 출력은 값을 확인하는 용도로 유용합니다.

  • Tip : 대화형 셸에서 _(밑줄)에는 마지막으로 자동 출력된 값이 저장됩니다. 3 + 4를 입력한 뒤 _ * 2를 입력하면 14가 출력됩니다. 이 기능은 대화형 셸에서만 동작합니다.


여러 줄 입력

>>> for i in range(3):
...     print(i)
...
0
1
2

for, if, 함수 정의처럼 콜론(:)으로 끝나는 문장은 다음 줄에 들여쓰기된 블록이 이어져야 하므로, 프롬프트가 ...로 바뀌어 입력이 계속됨을 알려줍니다.

블록의 입력을 마치려면 빈 줄에서 Enter를 누릅니다. 그때 블록 전체가 한 번에 실행되어 0, 1, 2가 출력됩니다. 반복문은 이후 강좌에서 자세히 다룹니다.


새로운 대화형 셸

Python 3.13부터는 새로운 대화형 셸이 기본으로 사용됩니다.

  • 프롬프트와 오류 메시지(Traceback)가 색상으로 표시됩니다.
  • if, for, 함수 정의처럼 여러 줄로 된 코드를 하나의 단위로 편집하고, 방향키로 불러와 다시 수정할 수 있습니다.
  • exit, quit, help를 괄호 없이 입력해도 동작합니다.
  • F1 키는 도움말, F2 키는 입력 기록 탐색, F3 키는 여러 줄 코드를 붙여넣는 붙여넣기 모드입니다.

Python 3.14부터는 입력하는 코드에 구문 강조(Syntax Highlighting)가 적용되고, import 문에서 모듈 이름 자동 완성이 지원됩니다.

대화형 셸에서 입력한 코드는 파일로 저장되지 않으며, 셸을 종료하면 만들었던 변수도 모두 사라집니다. 그래서 다시 사용할 코드는 아래에서 설명하는 스크립트 파일로 작성합니다.

  • Tip : 대화형 셸을 종료하려면 exit를 입력하거나, Windows에서는 Ctrl+Z 후 Enter, macOS와 Linux에서는 Ctrl+D를 누릅니다.

  • Tip : 이전 방식의 대화형 셸을 사용하려면 환경 변수 PYTHON_BASIC_REPL을 설정합니다.



프로젝트 생성

여러 줄의 코드를 작성할 때는 .py 확장자를 가진 스크립트 파일을 생성합니다.

프로젝트는 하나의 프로그램을 이루는 파일들을 모아 둔 폴더입니다. 처음에는 .py 파일 하나로 시작하지만, 프로그램이 커지면 여러 개의 .py 파일과 데이터 파일이 함께 모이게 되므로 프로젝트마다 별도의 폴더를 만들어 관리하는 것이 좋습니다.

스크립트 파일은 Python에 포함된 IDLE이나 Visual Studio Code, PyCharm 같은 편집기로 작성할 수 있으며, 메모장 같은 일반 텍스트 편집기로도 작성할 수 있습니다.

.py 파일은 특별한 형식이 아닌 일반 텍스트 파일이므로 어떤 편집기로 작성해도 됩니다. 다만 코드 편집기는 들여쓰기 자동 정렬, 구문 강조, 오류 표시 같은 기능을 제공하므로 작업이 훨씬 편리합니다.

  • Tip : Python은 소스 파일을 기본적으로 UTF-8 인코딩으로 읽습니다. 메모장 등에서 저장할 때 다른 인코딩을 선택하면 한글이 포함된 코드에서 오류가 발생할 수 있으므로 UTF-8로 저장합니다.


IDLE 사용하기

IDLE은 Python과 함께 설치되는 기본 개발 환경입니다. 시작 메뉴 등에서 IDLE을 실행하거나 터미널에서 다음 명령어로 실행할 수 있습니다.

python -m idlelib

-m idlelib은 표준 라이브러리에 포함된 idlelib 모듈을 프로그램처럼 실행하라는 의미입니다. IDLE 자체도 Python으로 작성된 프로그램이기 때문에 이와 같이 실행할 수 있습니다.

IDLE을 실행하면 대화형 셸인 Shell 창이 열립니다.

File → New File을 통하여 새로운 파일을 생성하고, 코드를 작성한 뒤 File → Save로 저장합니다.

Run → Run Module(F5)을 통하여 작성한 파일을 실행할 수 있으며, 실행 결과는 Shell 창에 출력됩니다.

  • Tip : Linux에서는 배포판에 따라 IDLE이 별도의 패키지로 제공되어 추가 설치가 필요할 수 있습니다.


스크립트 파일 작성

편집기에서 다음과 같이 코드를 작성한 후 test.py로 저장합니다.

test = "076923"
print(test)

대화형 셸과 달리 스크립트 파일에서는 변수 이름만 적어서는 값이 출력되지 않으므로, print()를 사용하여 출력합니다.

스크립트 파일은 사람에게 결과를 보여주는 것보다 작업을 수행하는 것이 목적이므로, 중간 계산 결과를 모두 화면에 출력하면 오히려 방해가 됩니다. 그래서 스크립트에서는 자동 출력이 없고, 보여주고 싶은 값만 print()로 명시합니다.



프로젝트 실행

터미널에서 test.py가 저장된 경로로 이동한 후 다음 명령어로 실행합니다.

cd 프로젝트_폴더_경로
python test.py
결과
076923

Windows에서는 py test.py, macOS와 Linux에서는 python3 test.py로도 실행할 수 있습니다.

cd(Change Directory)는 터미널의 현재 작업 경로를 바꾸는 명령어입니다. python test.py처럼 파일 이름만 적으면 인터프리터는 현재 작업 경로에서 test.py를 찾기 때문에, 먼저 파일이 있는 폴더로 이동해야 합니다. 이동하지 않고 python C:\work\test.py처럼 전체 경로를 적어도 실행할 수 있습니다.

python test.py를 입력하면 인터프리터는 다음 순서로 동작합니다.

  1. test.py 파일 전체를 읽어 문법을 검사하고 바이트코드로 변환합니다.
  2. 바이트코드를 위에서 아래로 한 줄씩 실행합니다. test에 문자열을 저장한 뒤 print()로 출력합니다.
  3. 마지막 줄까지 실행하면 인터프리터가 종료되고 터미널의 프롬프트로 돌아옵니다.
  • Tip : 파일을 찾을 수 없다는 오류가 발생한다면 터미널의 현재 경로와 파일이 저장된 경로가 같은지 확인합니다.


문법 오류와 실행 중 오류

스크립트 파일은 파일 전체를 먼저 바이트코드로 변환한 뒤 실행합니다. 이 차이는 오류가 발생했을 때 확인할 수 있습니다. 다음과 같이 두 번째 줄의 괄호를 닫지 않은 broken.py를 실행해 봅니다.

print("first")
print("second"
결과
  File “C:...\broken.py”, line 2
    print(“second”
         ^
SyntaxError: ‘(‘ was never closed

첫 번째 줄은 올바른 코드이지만 first조차 출력되지 않습니다. 변환 단계에서 문법 오류(SyntaxError)를 발견하면 실행 단계로 넘어가지 않기 때문입니다. 오류 메시지는 파일의 경로, 줄 번호(line 2), 문제가 시작된 위치(^), 오류의 종류와 이유를 차례로 알려줍니다. 경로는 파일이 저장된 위치에 따라 다르게 표시됩니다.


print("first")
print(10 / 0)
print("third")
결과
first
Traceback (most recent call last):
  File “C:...\runtime.py”, line 2, in <module>
    print(10 / 0)
          ~~~^~~
ZeroDivisionError: division by zero

반면 문법은 올바르지만 실행 도중에 문제가 생기는 경우에는 그 줄에 도달하기 전까지의 코드는 정상적으로 실행됩니다. 그래서 first가 출력된 뒤, 0으로 나누는 두 번째 줄에서 ZeroDivisionError가 발생하고 프로그램이 멈춥니다. 오류 이후의 print("third")는 실행되지 않습니다.

Traceback은 오류가 발생하기까지 어떤 코드를 거쳐 왔는지를 보여주는 기록이며, 맨 아래 줄이 실제 오류의 종류와 내용입니다. 오류를 해결할 때는 맨 아래 줄부터 읽는 것이 좋습니다.


실행 옵션

python -i test.py

-i 옵션을 사용하면 스크립트를 실행한 후 대화형 셸로 전환됩니다.

대화형 셸에서 test를 입력하면 스크립트에서 저장한 값인 '076923'이 출력됩니다. IDLE의 Run Module도 이와 같이 실행 후 Shell 창에서 변수를 확인할 수 있습니다.

스크립트가 끝난 시점의 변수들이 그대로 남아 있으므로, 결과가 예상과 다를 때 변수에 어떤 값이 들어 있는지 직접 확인하는 용도로 사용합니다.


python -c "print(3 + 4)"
결과
7

-c 옵션은 파일 대신 따옴표 안의 문자열을 코드로 실행합니다. 파일을 만들 필요 없이 짧은 코드 한 줄을 실행할 때 사용합니다.


import sys

print(sys.argv)
print(__name__)

위 코드를 args.py로 저장하고 파일 이름 뒤에 값을 추가로 적어 실행합니다.

python args.py hello 076923
결과
[‘args.py’, ‘hello’, ‘076923’]
__main__

파일 이름 뒤에 적은 값은 명령줄 인수(Command-line Argument)라 하며, sys.argv 목록에 문자열로 저장됩니다. 첫 번째 원소는 실행한 파일 이름이고, 그 뒤로 입력한 값이 순서대로 들어갑니다. 같은 프로그램을 다른 입력값으로 실행할 때 사용합니다.

__name__은 Python이 파일마다 자동으로 만들어 주는 변수로, 직접 실행한 파일에서는 "__main__"이라는 값을 가집니다. 다른 파일에서 import로 가져온 경우에는 파일(모듈)의 이름이 들어가며, 이 차이는 모듈 강좌에서 활용합니다.


바이트코드 확인

제 1강에서 설명한 것처럼 인터프리터는 코드를 바이트코드로 바꾸어 실행합니다. 표준 라이브러리의 dis 모듈을 사용하면 그 바이트코드를 직접 볼 수 있습니다. 다음 코드를 calc.py로 저장합니다.

x = 3 + 4
print(x)
python -m dis calc.py
결과
  0           RESUME                   0

  1           LOAD_SMALL_INT           7
              STORE_NAME               0 (x)

  2           LOAD_NAME                1 (print)
              PUSH_NULL
              LOAD_NAME                0 (x)
              CALL                     1
              POP_TOP
              LOAD_CONST               1 (None)
              RETURN_VALUE

왼쪽 숫자는 소스 코드의 줄 번호이고, 대문자로 된 이름이 가상 머신이 실행하는 바이트코드 명령어입니다.

1번 줄의 3 + 4는 덧셈 명령어 없이 LOAD_SMALL_INT 7로 바뀌어 있습니다. 변환 단계에서 상수끼리의 계산을 미리 처리했기 때문입니다. 그 결과를 STORE_NAME으로 x라는 이름에 저장합니다.

2번 줄은 print라는 이름과 x의 값을 불러온 뒤(LOAD_NAME) 함수를 호출(CALL)합니다. 마지막의 LOAD_CONST None, RETURN_VALUE는 파일 실행을 마치는 명령어입니다.

  • Tip : 바이트코드 명령어의 이름과 구성은 Python 버전마다 달라질 수 있으며, 위 결과는 Python 3.14.6 기준입니다. 바이트코드를 직접 다룰 일은 거의 없으므로 코드가 이런 중간 명령어로 바뀌어 실행된다는 원리만 이해하면 충분합니다.



가상 환경

프로젝트가 여러 개가 되면 프로젝트마다 필요한 외부 패키지와 그 버전이 달라집니다. 모든 패키지를 하나의 Python에 설치하면 한 프로젝트를 위해 패키지를 업데이트했을 때 다른 프로젝트가 동작하지 않는 문제가 생길 수 있습니다.

가상 환경(Virtual Environment)은 프로젝트 폴더 안에 독립된 Python 실행 환경을 만들어, 패키지를 프로젝트별로 따로 설치할 수 있게 해 주는 기능입니다. 표준 라이브러리의 venv 모듈로 만들 수 있습니다.

python -m venv .venv

위 명령어를 프로젝트 폴더에서 실행하면 .venv 폴더가 생성됩니다. 이 폴더 안에는 가상 환경 전용 python 실행 파일과 pip, 그리고 패키지가 설치될 별도의 폴더가 만들어집니다. Python 인터프리터 전체를 복사하는 것이 아니라, 원래 설치된 Python을 사용하면서 패키지 설치 위치만 분리합니다.


# Windows (명령 프롬프트)
.venv\Scripts\activate

# macOS, Linux
source .venv/bin/activate

가상 환경을 활성화(Activate)하면 터미널의 PATH 맨 앞에 가상 환경의 실행 파일 폴더가 추가됩니다. 제 1강에서 설명한 것처럼 PATH의 앞쪽 폴더가 우선하므로, 이후 입력하는 python과 pip는 가상 환경 안의 것이 실행됩니다. 비활성화하려면 deactivate를 입력합니다.

import sys

print(sys.prefix != sys.base_prefix)
결과
True

가상 환경의 Python으로 위 코드를 실행하면 True, 가상 환경이 아닌 Python으로 실행하면 False가 출력됩니다. sys.prefix는 현재 실행 환경의 위치이고, sys.base_prefix는 원래 설치된 Python의 위치이므로 두 값이 다르면 가상 환경 안에서 실행 중이라는 의미입니다.

  • Tip : PowerShell에서는 .venv\Scripts\Activate.ps1로 활성화합니다. .venv 폴더는 언제든 다시 만들 수 있으므로 프로젝트를 공유할 때는 폴더 자체가 아닌 필요한 패키지 목록을 함께 전달합니다.



정리

이름 설명 특징
python 대화형 셸 실행 표현식의 값을 자동 출력
python 파일.py 스크립트 파일 실행 파일 전체를 변환한 뒤 위에서부터 실행
python -i 파일.py 스크립트 실행 후 대화형 셸로 전환 실행 후 변수 확인
python -c “코드” 문자열을 코드로 실행 짧은 코드 실행
python -m 모듈 모듈을 프로그램처럼 실행 idlelib, dis, venv, pip 등
sys.argv 명령줄 인수 목록 모든 값은 문자열
python -m venv .venv 가상 환경 생성 프로젝트별 패키지 분리

대화형 셸은 짧은 코드의 동작을 확인할 때, 스크립트 파일은 프로그램을 저장하고 반복해서 실행할 때 사용합니다. 이후 강좌의 예제는 스크립트 파일로 실행한 결과를 기준으로 하므로, 값을 확인하려면 print()를 사용합니다.

댓글 남기기