티스토리 뷰

Python

Python, 모듈 사용하기

hwangyoungjae 2016. 5. 17. 13:53
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

>> 모듈 불러오기(import) <<

C/C++언어에서는 import와 비슷한 구문인 include문을 사용할수 있는 코드영역이 제한적이다.. 하지만 파이썬에선서는 import 구문을 어디서나(심지어 함수나 제어문안에서도)사용할수 있다.

모듈안의 어트리뷰트를 사용하려면 즉모듈은 import하는 방법은 3가지가 있다.

첫번째, import [모듈]

위와 같은 형식으로 모듈을 import하면 "모듈.이름" 형식으로 사용할수 있다.

>>> import os #os모듈 import

>>> os.getpid() #os모듈의 getpid()메서드를 사용

2988

 

두번째, from [모듈] import [어트리뷰트]

이 방법은 모듈안에 정의된 어트리뷰트를 전역영역으로 가져오고자 할때 사용된다.

"모듈.어트리뷰트"같은 형식으로 쓰지 않고 바로 참조할수 있다.

>>> from os import getcwd,getpid

>>> getcwd()

'D:\\python'

>>> getpid()

1548

어트리뷰트는 콤마로 구분하여 동시에 한개이상을 import할수도 있다.

>>> from os import *

이와 같이 사용하면 os모듈내의 모든 어트리뷰트를 전역영역으로 가져와 사용할수 있다.

모듈내의 어트리뷰트의 이름이 밑줄('_')로 시작한다면 전역영역으로 가져오지 않는다.

밑줄로 시작하는 어트리뷰트들은 모듈내에서만 사용가능하다는 것이다.

이는 같은이름의 코드가 충돌할 확률을 줄여주고모듈내부의 함수가 이름공간에 임포트되는것을 막고자 할때 사용하면 된다.

하지만, import [모듈]같은 형식으로 사용할때는 밑줄로 시작하는 어트리뷰트를 사용할수 있다.

 

세번째, import [모듈] as [별칭]

모듈명이 너무 길거나 특정모듈을 다른이름으로 참조하고자 할때 사용된다.

>>> import os.path as op

>>> op.isfile('a')

False

 

>> 모듈 임포트 파헤치기 <<

모듈을 import하면 sys.path에 등록된 디렉터리에서 모듈을 찾게된다.

만약 모듈의 바이트코드가 있으면 바로 임포트한다하지만 바이트코드가 없다면 인터프리터를 이용해 해당모듈의 코드를 바이트코드로 만들게 된다.

 

바이트코드는 일종의 중간파일로서 모듈파일이 simple.py라면 바이트코드는 simple.pyc라는 이름으로 모듈파일이 존재하는 디렉토리에 저장된다이렇게 저장된 바이트코드는 모듈이 임포트될때 인터프리팅되지 않고 바로 메모리에 로딩되므로 결과적으로 임포트가 더 빨라진다바이트코드는 모듈의 내용이 변경되지 않는 이상 새로 만들어지지 않는다.

pyc파일이 생성된 다음 import구문을 실행하면 별도의 인터프리팅없이 어트리뷰트들을 현재의 이름공간으로 가져오거나 모듈의 이름을 현재 이름공간으로 가져온다그리고 해당 코드들을 메모리에 로딩한후 모듈의 코드가 실행된다.

 

모듈이 임포트되면 메모리에 모듈코드가 로딩되어 프로그램이나 파이썬 인터프리터가 끝나기 전까지 변경되지 않는다.

한번 임포트한 모듈을 다시 읽어들일때는 인터프리터를 종료하고 다시 실행해야 하는데

프로젝트를 진행할때는 모듈을 조금씩 수정하고 테스트하는 과정을 거치게 된다이때마다 인터프리터를 종료하고 다시 임포트하긴 상당히 번거롭다따라서 imp모듈의 reload()메서드를 이용하면 이미 임포트되어있는 모듈을 다시 읽어들여 새로운내용으로 다시 임포트 할수 있다.

>>> import yj

>>> import imp

>>> imp.reload(yj) #yj모듈을 리로드한다.

<module 'yj' from 'D:\Cloude\Python\lib2\yj.py'>

 

>같은모듈을 다른별칭으로 import할경우의 동작

print('testmodule imported')

n=10

위와같은 내용의 testmoudle이라는 모듈을 생성후 아래와같이 테스트해보았다.

>>> import testmodule

testmodule imported

>>> import testmodule as test1

>>> import testmodule as test2

>>> test1.n

10

>>> test1.n=100

>>> test2.n

100

파이썬에서는 모든것이 객체(object)로 되어있고모듈도 예외가 아니다모듈이 임포트되면 코드가 메모리에 로딩되면서 레퍼런스를 전달해준다위에서 test1,test2는 바로 testmodule에 대한 레퍼런스인것이다모듈은 메모리에 한번하나만 로딩되고 이를 참고하는 여러개의 레퍼런스가 있는것이다따라서 이미 import되어있는 모듈을 별칭으로 다시 임포트한다하여도 이미 메모리에 로딩되어있으므로 print함수는 실행되지 않는것이고, test1.n또한 testmodule n변수를 참조한것이므로 test2.n또한 함께 변한것이다함께 변하였다기 보다는 testmodule.n의 값이 변하였기 때문에 위와같이 출력된것이다.

 

>> 모듈의 경로 <<

모듈을 임포트할때 모듈의 위치를 다 적어주지 않고 단지 모듈의 이름만으로 임포트할수 있는 이유는 파이썬이 디렉터리에 해당 모듈파일이 있는지 검색하기 때문이다이름만으로 임포트되게 하러면 모듈검색경로에 모듈파일이 있어야 한다모듈을 임포트할때 파이썬은 다음과 같은 순서로 모듈을 찾는다.

첫번째현재작업디렉토리(Current Working Directory)

프로그램이 실행된 곳의 디렉터리 안을 맨처음 검색한다.

 

두번째, PYTHONPATH환경변수에 등록된 위치

홈 디렉터리 검색이후 파이썬은 PYTHONPATH라는 환경변수에 등록된 디렉터리를 검색한다사용자가 만든 디렉터리를 모듈 검색경로에 등록하려면 PYTHONPATH환경변수에 등록하면 된다.

PYTHONPATH의 환경변수를 등록하는 방법은 아래와 같다.

>Windows

"제어판 -> 시스템(sysdm.cpl) -> 고급탭 -> 환경변수"로 들어가 시스템변수에서 변수이름이 PYTHONPATH로 되어있는 항목에 경로를 추가하면 된다만약 PYTHONPATH변수가 없다면 생성해주면 된다.

 

>Linux

쉘 설정파일에 아래와 같은 형식으로 라인을 추가해주면 된다.

export PYTHONPATH=$PYTHONPATH:/home/user/mymodule

 

세번째표준라이브러리 디렉토리

다음은 파이썬의 표준라이브러리 디렉토리를 검색한다.

파이썬의 모듈검색경로목록은 sys.path에 리스트형식으로 관리되고 있다.

>>> import sys

>>> sys.path

['C:\\Python32\\Lib\\idlelib', 'D:\\Cloude\\[Blog]', 'D:\\Cloude\\Python\\lib2', 'C:\\WINDOWS\\system32\\python32.zip', 'C:\\Python32\\DLLs', 'C:\\Python32\\lib', 'C:\\Python32', 'C:\\Python32\\lib\\site-packages']

또한 sys.path에 경로를 넣어주는것은 프로그램동작중에도 가능하다또한 이미 있는 경로를 삭제할수도 있다.

 

※ '__main__'을 이용한 팁

우리가 생성한 파이썬 파일들은 임포트해서 사용할수도 있지만 직접실행할수도 있다.

그렇다면 임포트되었을때오 직접 실행했을때 각기 다른 동작을 하게 하려면 어떻게 해야할까파이썬에서는 이를 구별하는 특별한 함수나 값을 제공하지 않는다.

하지만 __name__이라는 특별한 어트리뷰트를 이용해서 이를 구분할수 있다.

__name__어트리뷰트는 읽을수만 있는 속성이며 자기모듈의 이름을 나타낸다.

>>> import testmodule

testmodule imported

>>> testmodule.__name__

'testmodule'

하지만 직접실행할때는 __name__은 모듈으 이름이 아니라 '__main__'이라는 값이 저장되게 된다즉 모듈의 코드가 메인으로 실행되었다는 뜻이다.

__name__이 어떻게 변하는지 확인하기 위하여 testmodule모듈을 아래와 같이 수정하였다.

print('testmodule imported')

print(__name__)

위의 모듈의 실행결과는 아래와 같다.

 

직접실행했을때

testmodule imported

__main__

 

임포트했을때

>>> import testmodule

testmodule imported

testmodule

 

위처럼 __name__은 모듈이 직접실행되었을때와 임포트됬을때 서로 다른 값을 가지게 되므로 이를 이용하여 파일을 모듈전용으로 만들거나 또는 실행전용으로 만들수 있다.

 

__name__을 이용한 구분방법은 매우 유용한데 특히 모듈을 개발할때 많이 사용한다.

모듈을 수정하거나 코드를 추가할때마다 임포트해서 테스트코드를 수행하는것보다 직접 실행했을때 테스트를 수행하면 바로 테스트결과를 확인할수 있기 때문에 개발효율이 높아진다.

아래와 같이 코드를 짜면 직접실행할때는 메서드가 바로 실행되지만 import할때는 메서드는 실행되지 않고 임포트만 된다.

def printtest():

    print('test file')

 

if __name__ == '__main__':

    printtest()

 

'Python' 카테고리의 다른 글

Python,module time [시간]  (0) 2016.05.17
Python, pickle  (0) 2016.05.17
Python, 클래스(Class) - 상속  (0) 2016.05.09
Python, 클래스(Class) - 연산자중복정의  (0) 2016.05.09
Python, 클래스(Class)  (0) 2016.05.09
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함