본문 바로가기
Python/Python Basic

19. Python - 다른 Python 파일의 함수, 변수를 호출하기

by Rosmary 2020. 5. 3.
728x90
반응형

메모장이나, 기타 편집 프로그램을 이용해 Python 코드를 작성하여 프로그램을 몇 개 만들다 보면, 각자 자주 사용하는 코드가 하나 둘씩 나타날 것이다. 필자의 경우에는, 프로그램 내에서 어떤 작업을 진행할 것인지 말것인지에 대해 물어보고 사용자의 응답에 따라 서로 다른 작업이 진행되도록 하는 코드를 자주 작성한다. 예를 들면 아래와 같은 것.

 

----------------------------------------------

print("계속 하시겠습니까?, end =="")

answer = input("").lower()

 

if(answer == 'y'): print("continue")

else(answer == 'n') print("return")

----------------------------------------------

 

이 코드를 쓸 일이 많다보니, 코드 자체를 함수화 한 뒤, 함수를 호출하는 방식으로 사용한다.

 

-----------------------------------------------

def qna():

    print("계속 하시겠습니까?, end =="")

    answer = input("").lower()

    if(answer == 'y'): print("continue")

    else(answer == 'n') print("return")

-----------------------------------------------

 

그런데, 이 코드를 특정 Python 파일, 예를 들어 test1.py라고 하자, 에서만 사용하는 것이 아니라, test2.py나 test3.py에서도 사용한다면, test1.py외에 test2, test3.py 파일에도 이 qna() 함수가 동일하게 정의가 되어 있어야 한다. "저 함수 코드만 복사해서 각각의 파일에 붙여넣기 하면 되지 않나요?"라고 묻는다면 사실 필자는 할 말이 없지만... 조금 더 간편한 방법으로 저 qna() 함수가 정의된 다른 python 파일에서 함수를 더 간결하게 사용할 수 있는 방법이 있기 때문에 본 포스팅을 작성한다..

 

우선, 메모장에 다음과 같은 코드를 작성하고, 이를 test1.py로 저장하자.

 

-----------------------------------------------

def qna():

    print("계속하시겠습니까?: ", end = "")
    answer = input("").lower()

    if(answer == 'y'): print("Continue")
    elif(answer == 'n'): print("Return")
    else: print("잘못된 값 입력")

 

qna()    # qna()함수 호출

-----------------------------------------------<test1.txt>

 

메모장에 작성했더니, 한글이 깨져서 출력된다

 

 

cmd 창에서 test1.py를 저장한 폴더로 이동하여 type 명령어로 test1.py 내용을 살펴보면, qna() 함수 하나가 정의되어 있고, 이 함수를 호출하는 코드가 맨 마지막에 작성되어 있는 것이 보인다. 따라서 이 test1.py 파일을 실행하면 다음과 같은 화면이 출력된다.

 

 

 

 

이 과정이 확인되었다면, test1.py의 마지막 코드 "qna()"를 삭제하고 저장한 뒤, 다음 단계를 보도록 하자.

 

 

1. import 예약어

 

이제, test2.py 라는 파일에서, test1.py의 qna() 함수를 호출해서 사용하려고 한다. 다른 파일에서 사용하는 함수를 호출하기 위해서는 import라는 예약어를 사용해서 test1.py의 qna()함수를 test2.py 내에 정의해주는 과정이 선행되어야 한다. 이를 위해, 먼저 test1.py 파일을 test2.py로 "수입"하는 과정을 거처야 한다. 이 때 사용하는 예약어가 import이다.

 

------------------------------------

import {도입할 Python 파일명}   ** .py 확장자명은 제외한다

------------------------------------

 

해당 코드를 test2.py에 작성하면, test1.py의 내용, 즉 qna()함수를 test2.py가 사용할 수 있게 된다. import 한 Python 파일 내에 작성된 함수의 사용은 크게 어렵지 않다. import한 파일의 이름 뒤에 점(.)을 찍고, 그 뒤에 함수명을 적어 호출하면 된다. 아래와 같이.

 

------------------------------------------

import test1

 

print("산책을 가려 합니다")

test1.qna() 

 

print("프로그래밍을 하려 합니다")

test1.qna() 

-----------------------------------------<test2.py>

 

코드 작성이 완료 되었다면, test2.py라는 이름으로 test1.py가 저장된 폴더에 저장해주자. 그리고 test2.py를 cmd로 실행하면 다음과 같은 화면이 나타난다.

 

 

 

 

분명 test2.py에는 qna()와 관련된 어떤 함수도 정의되어 있지 않지만, import 예약어를 사용하여 test1.py를 test2.py에 사용가능하도록 코드 한 줄 넣어주니, 바로 qna() 함수를 호출하여 사용하는 것이 가능해진다. 

 

단, import를 '위와 같이' 사용할 때, 주의해야 할 점이 있는데, import 할 파일이 반드시 실행할 파일과 동일한 폴더 내에 존재해야 한다는 것이다(사실 다른 폴더에 있더라도, 하위 폴더에 있다면 사용 가능한 방법이 있긴 하다.  이는 뒤에서 설명할 예정이다). 만약, 다른 폴더에 저장되어 있는 test1.py를 사용한다고 "import test1.py" 코드를 쓰게 되면, 다음과 같이 모듈(파일)을 찾을 수 없다는 에러 메세지가 출력될 것이다.

 

 

 

필자가 test.py를 하위 폴더인 Desktop으로 옮겨버렸기 때문에 test2.py에서 test1.py파일을 찾지 못해 import test1.py라는 문구를 실행할 수 없기 때문에 나타난 에러 메세지다. 이렇게 사용할 파일이 하위 폴더에 위치한 경우, import는 다음과 같이 사용하면 된다.

 

-------------------------------------------------

import {하위폴더명}.{도입할 Python 파일명}

-------------------------------------------------

 

test2.py에 import 부분을 위와 같이 변경하게 되면, 함수 호출 부분도 필히 import 뒤의 내용과 동일하게 변경되어야 한다. 아래와 같이.

 

 

 

 

도입한 파일의 함수 뿐만 아니라, 변수나 기타 클래스와 같은 객체들도 호출이 가능한데, 이들의 호출방법 역시 함수 호출과 다를바 없다. 만약 test1.py에 변수 variable = "Hello World"가 정의되어 있다면, test2.py에서는 print(test1.variable)이라는 코드로 test1.py에 정의된 변수를 출력하는 것이 가능하다.

 

 

 

2. from ... import 예약어

 

만약, 필자가 test1.py 파일에 qna() 외에도 이것 저것 잡다한 함수를 무진장 많이 정의해 놓았다고 가정해보자. import 예약어만 사용하여 test1.py 파일 자체를 통째로 도입하는 경우, test2.py 파일을 실행할 때마다, 거대해진 test1.py을 호출하는 것이 버거워진다. 만약, 이 test1.py 내용 중, 내가 필요한 함수만 콕 찝어서 호출한다면, test2.py를 실행하는데 걸리는 시간이 한결 단축될 것이다.

 

도입 파일로부터 특정 함수나 변수 또는 클래스만 호출하는 방법은 아래와 같다.

 

----------------------------------------------------------------------------------------------

from {도입할 Python 파일명} import {도입 파일 내의 함수, 변수 또는 클래스 명}

----------------------------------------------------------------------------------------------

 

이렇게 from... import 방식으로 함수만 도입하게 되면, test2.py에서는 함수 호출 시, "qna()"를 작성하는 것만으로도 함수 호출이 가능해진다. 아래의 두 스크린 샷을 비교해보자.

 

 

from... import 방식으로 다른 파일의 함수, 변수 등을 도입하는 방식은 장단점이 있다. from... import 문은 호출을 위한 코드 길이가 길지 않기 때문에, 도입 파일 내에 함수 정의만 잘 되어 있다면, 메인 파일의 코드가 훨씬 간결해진다는 장점이 있다. 하지만, 코드 중 일부가 잘못된 부분이 있는 경우, 해당 함수나 변수가 메인 폴더에 있는지, 아니면 다른 파일로부터 도입된 내용인지 확인하기가 조금 번거롭다. import 만 사용하는 경우, 함수명이나 변수명 앞에 해당 함수 또는 변수가 어디에서 온 파일인지 명확히 표시가 되는 반면, from ... import는 호출 코드에 함수명 하나만 달랑 존재하기 때문에 코드 수정 시, 이를 파악하기가 조금 번거롭다. 

 


지금까지 다른 Python 파일의 내용을 호출하여 사용할 수 있는 import, from...import 예약어에 대해 알아보았다. 본문 내용에서 하나 더 추가하자면, 이렇게 import를 진행하는 파일의 경우, 변수, 함수, 클래스 정의 외에 어떠한 실행 코드도 들어가지 않도록 작성해주는 것이 좋다. 필자가 test1.py에서 마지막의 qna()를 제거하라고 한 이유가 이 때문인데, 이 실행 코드가 존재하는 경우, import나 from...import로 해당 파일을 호출할 때마다. test1.py의 qna()함수가 먼저 실행되기 때문이다. 궁금하신 분들은 위의 과정을 test1.py의 마지막에 qna()를 작성하고 진행해보면 된다.

 

다음 포스팅에서는 Python을 이용해 text파일을 쓰고, 그 내용을 읽는 방법에 대해 포스팅하려고 한다.

 

 

FIN.

반응형

댓글