programming코딩

Start Python #4 Backend Program 만들기 – library import

python의 가장 큰 장점인 library 에 대해서 알아보겠습니다.

python은 좋은 library가 참 많습니다.

근데 library 설치는 쉽게 하게되지만 좀 더 자세히 알아보지는 않는 편입니다.

python package에 대해서 상세 정리들어가봅니다.

특히 내가 만든 다른 폴더 Class 참조는 완전 쉽게 설명했습니다.

그동안 이게 어려웠거든요.

그리고 이제부터 코드가 길어지니 코드는 github에 repository를 만들어 올렸습니다.

Watch, Star, Fork 는 환영합니다.

제가 방향성을 정하는데 큰 도움이 될것 같습니다.

library 설치

python2.x이면 pip, python3.x 이면 pip3를 사용합니다.

저는 pymysql을 mysql 사용을 위해서 설치할 것입니다.

pip3 install pymysql

어떤 library를 사용할 것인지는 일반적으로 구글 검색하면 되구요.

아니면 댓글이나 페메주세요. ^^;

아는데까지 말씀드리겠습니다.

pip이 library 가져오는 곳

pypi.org 에서 가져옵니다.

본인이 반복적으로 사용하는 코드가 있다면 pypi.org에 올리고 pip으로 install해가면서 사용하면 됩니다.

Chapter #3 Class 편에 언급했던 폴더 구조에서 util 폴더는 향후 package를 만들어 pypi.org에 올리는 것까지 진행할 것입니다.

pip이 library 설치하는 곳

print (sys.path)를 해보시면 제 환경에서는 아래와 같이 나옵니다.

['/home/ubuntu/workspace/app/aiLotto/tests', '/home/ubuntu/.local/bin', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/ubuntu/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages', '/home/ubuntu/workspace/app']

아래 경로에 곳에 설치가 됩니다.

‘/home/ubuntu/.local/lib/python3.6/site-packages’

빨간색으로 표시한 library들이 이번 강좌에서 설치한 pytest와 pymysql입니다.

pip이 설치한 library 예제

python은 워낙 다양한 환경에서 실행되고 특히 virtual 환경에서 실행될 경우 별도의 경로들이 존재하게 되니 print(sys.path) 해보시면 각 환경에서 실질적인 위치를 알 수 있습니다.

library import 하기

import pymysql

from abc import ABCMeta

import tensorflow as tf

이런 부분들은 library 사용 예제들에 잘 설명되어 있는대로 사용하시면 됩니다.

내 폴더 구조에서 경로 설정

그보다 어려웠던게 내가 만든 코드의 트리 구조에서 import 하는것이 좀 복잡한데요.

이 부분을 쉽게 설명해보겠습니다.

아래 그림이 현재 제 코드의 폴더 구조입니다.

이를 기반으로 설명을 하겠습니다.

같은 폴더 안에 있는 파일로부터 import 하기

Config.py 에서 Singleton class를 import 하기 위해서는 아래와 같이 합니다.

클래스 이름에 . (Dot) 를 붙여주면 됩니다.

현재 폴더를 의미합니다.

다른 폴더 경로에 있는 파일로부터 import 하기

  • 각 폴더마다 __init__.py 를 만듭니다.

앞서 붙인 제 코드의 폴더 구조에 보면 밑줄로 __init__.py를 표시해둔것을 보실 수 있습니다.

그리고 다음과 같이 외부로 노출할 Class들을 적어줍니다.

여기에 적어주지 않으면 ‘module’ object is not callable 이라는 Error가 발생합니다.

  • import할 파일에서 path를 추가해주고 package를 import합니다.

참조할 폴더의 상위 폴더를 sys.path에 append해줍니다.

그리고 from <폴더 이름> import <클래스 이름> 해주면 됩니다.

앞서 붙인 제 코드의 폴더 구조들의 폴더를 하나의 패키지처럼 사각형으로 묶어놓은걸 보실 수 있습니다. 그렇게 봐주시면 됩니다.

위와 같이 sys.path append를 하는 이유는 앞서 print(sys.path) 했을때 결과에서 알 수 있습니다.

python 실행시 package들은 참조되기 위해서는 sys.path에 추가되어 있어야 합니다.

절대 경로로 지정이 되어야지 다른 경로에서 import할때도 유지가 가능하므로 __file__과 os.path.dirname를 이용해야 합니다.

아래는 예제로 print해본 결과입니다

print (__file__)
print (os.path.dirname(__file__))
print (os.path.dirname(os.path.dirname(__file__)))
print (os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
/home/ubuntu/workspace/app/aiLotto/tests/test_AiLottoApp.py
/home/ubuntu/workspace/app/aiLotto/tests
/home/ubuntu/workspace/app/aiLotto
/home/ubuntu/workspace/app

다음은 print(sys.path)를 한 결과입니다.

여기에 포함되어 있는 경로의 package들만 참조가 가능합니다.

 ['/home/ubuntu/workspace/app/aiLotto/tests', '/home/ubuntu/.local/bin', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/home/ubuntu/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages',  '/home/ubuntu/workspace/app/aiLotto', '/home/ubuntu/workspace/app'] 

마치며

직접적인 코드 설명은 아니지만 꼭 알아야 하는 사항이라 Chapter 하나로 설명을 하였습니다.

혹시 궁금하신거나 의견이 있으시면 댓글이나 페메주시면 감사하겠습니다.

다음 Chapter에서는 실질적인 코드 설명을 하겠습니다

아마 mysql 사용하는 것이 될것 같습니다.

Leave a Reply