내가 만든 .py 파일도 모듈입니다. 같은 폴더에 있는 파일이름.py는 확장자 .py를 빼고 import 파일이름 또는 **from 파일이름 import 함수이름**으로 가져다 씁니다.
프로그램이 길어지면 한 파일 안에 모든 함수와 실행 코드를 다 넣어 두기보다, 계산 함수들을 모아 둔 파일(calc.py)과 실제로 실행하는 파일(main.py)로 나누어 두는 편이 읽기도 고치기도 좋습니다. 모듈 불러 쓰기에서 배운 import 문법은 파이썬이 기본으로 제공하는 모듈뿐 아니라 내가 같은 폴더에 만든 .py 파일에도 똑같이 동작합니다.
1내 .py 파일 만들고 다른 파일에서 가져오기
같은 폴더에 calc.py와 main.py 두 파일이 있다고 해 봅시다. 먼저 calc.py에 덧셈과 곱셈 함수를 정의해 저장합니다.
def add(a, b):
return a + b
def mul(a, b):
return a * b
이제 같은 폴더의 main.py에서 calc.py의 함수를 가져다 쓸 때는 파일 이름 뒤의 .py를 떼고 calc라고만 적습니다.
from calc import add
import calc
print(add(3, 5))
print(calc.mul(3, 5))
from calc import add:calc.py에서add만 꺼내 와add(3, 5)로 바로 부르면8이 출력됩니다.import calc:calc.py전체를calc라는 이름으로 가져와calc.mul(3, 5)처럼 마침표로 부르면15가 출력됩니다.
2import할 때 파이썬이 하는 일
파이썬이 import util이나 from util import ...을 처음 만나면, 같은 폴더에서 util.py를 찾아 위에서부터 끝까지 한 번 실행합니다. 그 과정에서 def로 정의된 함수와 변수들이 모듈 안에 만들어집니다.
그렇다면 모듈 파일 맨 바깥(함수 밖)에 print() 줄이 적혀 있으면 어떻게 될까요? 같은 폴더의 util.py와 main.py가 아래와 같을 때 main.py를 실행하면 무엇이 먼저 찍힐지 맞혀 보세요.
print('util 준비')
def double(x):
return x * 2
from util import double
print(double(10))
실행 결과 보기
util 준비가 먼저 찍히고 그다음 줄에 20이 찍힙니다.
예상과 다르면 그곳이 배울 곳입니다. from util import double을 실행하는 순간 파이썬이 util.py를 위에서부터 실행하므로, 함수 밖에 있던 print('util 준비')가 먼저 실행되고 이어서 print(double(10))의 20이 출력됩니다.
그래서 다른 파일에서 가져다 쓸 모듈 파일에는 보통 함수 정의(def)와 상수만 넣어 두고, 연습 삼아 찍어 보던 print()나 input()은 지워 두는 것이 좋습니다.
예제
세금 계산 함수를 따로 파일로 나누기
한 파일 안에서 쓰던 상수 RATE와 함수 with_tax(p)를 tax.py와 main.py로 나누는 과정을 비교해 봅시다. 먼저 한 파일에 있을 때는 다음과 같이 동작합니다.
RATE = 0.1
def with_tax(p):
return int(p * (1 + RATE))
print(RATE)
print(with_tax(5000))
0.1
5500이 코드에서 상수와 함수 정의를 tax.py로 옮기고, main.py에서는 import tax로 가져다 쓰면 실행 파일이 깔끔해집니다.
RATE = 0.1
def with_tax(p):
return int(p * (1 + RATE))
import tax
print(tax.RATE)
print(tax.with_tax(5000))
함수(tax.with_tax)뿐 아니라 모듈 안에 정의한 상수(tax.RATE)도 마침표로 꺼내 읽을 수 있어 똑같이 0.1과 5500이 출력됩니다.
자주 틀리는 곳
1. import 뒤에 .py까지 적는다
틀린 생각: 파일이 .py로 끝나니 import 뒤에도 .py를 붙여 적어야 한다.
open('memo.txt')에서는 파일 이름을 문자열로 넘기므로 확장자까지 적지만, import 문에서 마침표(.)는 파일 확장자가 아니라 패키지 안의 하위 모듈을 가리키는 기호입니다.
import math.py
Traceback (most recent call last): File "main.py", line 1, in <module> import math.pyModuleNotFoundError: No module named 'math.py'; 'math' is not a packageimport calc.py나 import math.py처럼 뒤에 .py를 붙이면 ModuleNotFoundError가 납니다.
맞는 규칙: import나 from ... import에는 파일 이름에서 .py를 뺀 이름(import calc)만 적습니다.
2. 모듈 파일에 연습용 print()를 남겨 둔다
틀린 생각: from greet import hi는 hi 함수만 골라 가져오므로 greet.py의 다른 줄은 실행되지 않는다.
from greet import hi로 함수 하나만 가져오더라도, 파이썬은 먼저 greet.py 전체를 위에서 아래로 실행해 이름들을 만듭니다.
def hi():
return '안녕'
print(hi())
from greet import hi
print('main 시작')
main.py에서는 아직 hi()를 부르지도 않았는데, greet.py 끝에 남겨 둔 print(hi()) 때문에 '안녕'이 먼저 찍히고 그다음에 'main 시작'이 찍힙니다.
맞는 규칙: 가져다 쓸 모듈 파일에는 함수 정의와 상수만 두고, 시험 삼아 넣어 본 실행 줄은 지워 둡니다.
3. 내 파일 이름을 표준 라이브러리 이름(random.py, math.py)과 같게 짓는다
틀린 생각: 주사위 연습 파일이니 파일 이름을 random.py로 저장하고 그 안에서 import random을 쓰면 된다.
파이썬이 import random을 만나면 표준 라이브러리보다 지금 폴더에 있는 random.py를 먼저 가져옵니다. 결국 표준 라이브러리 대신 자기 자신을 가져오게 되어 random.randint()를 찾을 수 없게 됩니다.
맞는 규칙: 내 .py 파일 이름은 math.py, random.py, datetime.py 같은 표준 라이브러리 이름과 겹치지 않게 짓습니다(my_dice.py 등).
확인 문제
1. 같은 폴더의 conv.py와 main.py가 아래와 같을 때, main.py를 실행하면 무엇이 출력될까요?
UNIT = 100
def to_cm(m):
return m * UNIT
from conv import to_cm
import conv
print(to_cm(3))
print(conv.UNIT)
힌트
to_cm(3)은 3 * 100을 돌려주고, conv.UNIT은 conv.py의 UNIT 값을 읽습니다.
정답
첫 줄에 300, 둘째 줄에 100이 출력됩니다. from conv import to_cm으로 가져온 to_cm(3)은 300을 돌려주고, import conv로 가져온 conv.UNIT은 100입니다.
2. 같은 폴더에 있는 score_util.py 파일에서 average 함수를 가져와 print(average([80, 90]))처럼 마침표 없이 부르려고 합니다. 빈칸을 채우세요.
from __________ import average
print(average([80, 90]))
힌트
파일 이름 score_util.py에서 확장자 .py를 뺀 모듈 이름을 적습니다.
정답
score_util입니다 (from score_util import average). .py까지 적으면 오류가 납니다.
3. 같은 폴더의 helper.py에서 check 함수를 가져오려는데 아래 코드에서 오류가 납니다. 1번 줄을 어떻게 고쳐야 할까요?
from helper.py import check
print(check(10))
힌트
import 문에서는 파일 확장자 .py를 쓰지 않습니다.
정답
1번 줄의 .py를 빼고 from helper import check로 고칩니다.
아래 코드는 box.py 파일을 만들고 그 내용을 다시 읽어 확인합니다. 둘레를 구하는 함수 줄도 덧붙여 보세요.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.