파이썬을 여행하는 히치하이커를 위한 안내서 - 훌륭한 코드 배포하기, 사용자와 상호작용
by Yoonkh
훌륭한 코드 배포하기
유용한 단어와 콘셉트
-
의존성
- 일부 프로젝트에서는 파이썬 라이브러리 외의 의존성이 있을 수 있다. Postgres 데이터베이스, C 컴파일러, C 라이브러리 공유 객체 등을 예로 들 수 있다. 이러한 의존성이 별도로 명시되어 있지 않을 수도 있으나, 이들이 없는 경우 빌드가 불가능하다.
-
내장 배포
- 내장 배포는 파이썬 패키지의 배포 형식이다(다른 리소스와 메타 데이터를 포함할 수 있다) 별도의 컴파일 없이 설치하고 실행할 수 있다.
-
에그
- 에그(egg)는 내장 배포의 한 형식으로, 설치에 사용되는 메타 데이터가 담긴 특수한 구조의 ZIP 파일이다. Setuptools 라이브러리에 의해 소개된 이래로 수년간 사실상 표준이었으나, 공식 파이썬 패키징 형식은 아니었다.
-
휠
- 휠(wheel)은 내장 배포의 한 형식으로, 내장 파이썬 라이브러리를 배포하기 위한 표준이다. ZIP 파일 형식으로 패키징되며, pip가 패키지를 설치/제거하는 데 사용할 메타 데이터가 포함되어 있다.
코드 패키징
패키징이란 코드를 배포하기 위한 필수 파일 구조를 만들어서 여기에 필요한 파일을 추가하고 적절한 변수를 정의하는 작업이다.
Conda
아나콘다 파이썬 재배포판을 설치했다면 conda가 기본 패키지 관리자이고, 기본 패키지 저장소가 http://anaconda.org/로 설정되어 있을 것이다.
PyPI
파이썬의 패키지 생태계는 PyPI, pip와 같은 도구를 통해 잘 정립되어 있다. 따라서 가벼운 실험을 하든 커다란 전문가 시스템을 구성하든 이에 필요한 패키지를 다운 받아 설치하는 작업은 쉽다.
오픈소스 파이썬 모듈을 작성하고 있다면, 이를 PyPI에 호스팅 해야 한다. ( PyPi는 치즈샵이라고도 많이 알려져 있다. )
샘플 프로젝트
PyPA의 샘플프로젝트는 파이썬 프로젝트 패키징에 대한 모범 사례를 보여 준다. setup.py 모듈의 주석에는 옵션에 대한 조언이 담겨 있으며, 관련 PEP 문서가 소개되어 있다.
easy_install이 아닌 pip를 사용하자
2011년 부터 PyPA는 파이썬 라이브러리의 배포, 패키징, 설치 표준의 부재로 인해 생겨난 무수한 혼란과 논의를 해결하기 위해 노력해왔다. 그 결과 PEP453에서 파이썬의 기본 패키지 인스톨러로 pip가 채택되었으며 파이썬 3.4와 그 이후 배포판에 포함되어 있다.
개인용 PyPI
PyPI 이외의 소스 로부터 패키지를 설치한다면, 설치할 패키지를 포함하는 디렉터리에서 간단히 HTTP 서버를 호스팅하여 해결할 수 있다.
Pypiserver
Pypiserver는 미니멀한 PyPI 호환 서버이며, easy_install 혹은 pip를 위해 일련의 패키지를 제공하는 데 사용할 수 있다.
s3-hosted PyPI
개인용 PyPI 서버를 위한 또 다른 선택지로는 아마존의 S3에 호스팅하는 방법이 있다. 먼저 S3 버킷과 함께 아마존 웹 서비스 계정이 있어야 한다.
pip를 위한 VCS(버전 관리 시스템)지원
pip를 사용하여 버전 관리 시스템에서 코드를 직접 가져올 수도 있다.
코드 동결하기
코드 동결이란 파이썬을 설치하지 않은 최종 사용자도 애플리케이션을 사용할 수 있도록 독립적으로 실행 가능한 번들을 만드는 것을 의미한다.
배포 파일이나 번들은 애플리케이션 코드와 파이썬 인터프리터를 모두 담고 있다.
Pyinstaller
Pyinstaller는 맥, 윈도우, 리눅슬르 위한 애플리케이션을 만드는 데 사용된다. Pyinstaller의 주목적은 서드파티 패키지와 호환이 되도록 만드는 것이다. 지원하는 그래픽 라이브러리는 Pillow, pygame, PyOpenGL, PyGTK, PyQT4, PyQT5, PySide, wxPython이다.
cx_Freeze
cx_Freeze 또한 Pyinstaller처럼 리눅스, 맥, 윈도우 시스템에서 파이썬 프로젝트를 동결할 수 있다. 그러나 cx_Freeze팀에서는 Wine을 사용하여 윈도우용으로 컴파일하는 것을 권장하지 않는다. 애플리케이션이 작동할 수 있도록 수동으로 복사해야 하는 파일이 있기 때문이다.
py2app
py2app은 맥을 위한 실행 파일을 빌드한다. cx_Freeze와 마찬가지로 distutils를 확장하였으며, py2app이라는 새 명령어를 추가하였다.
py2exe
py2exe는 윈도우를 위한 실행 파일을 빌드한다. 매우 인기 있는 윈도우용 비트토렌트가 py2exe를 사용해 만든 대표적인 애플리케이션이다.
bbfreeze
bbfreeze는 현재 유지 보수가 중단되었고, 파이썬 3로 포딩되지 않았음에도 많이 사용되고 있다. cx_Freeze, py2app, py2exe와 마찬가지로 distutils를 확장하여 bbfreeze 명령어를 추가하였다.
리눅스 내장 배포를 위한 패키징
리눅스에서 파이썬 코드를 배포하는 ‘올바른 방법’은 리눅스 내장 배포(built distribution)을 만드는 것이다. 내장 배포는 프리징된 패키지와 같으나, 파이썬 인터프리터가 포함되어 있지 않아 코드 동결 대비 2MB 가량 용량이 적다.
사용자와 상호작용
Jupyter Notebook
Jupyter는 파이썬 코드를 화면에 대화식으로 띄우고 실행할 수 있도록 돕는 웹 애플리케이션이다. Jupyter는 사용자 간 인터페이스이다!
사용자는 웹 브라우저에서 Jupyter의 클라이언트 인터페이스를 보게 된다. 이 인터페이스는 CSS, HTML, 자바스크립트로 작성되었다. 클라이언트 시스템은 파이썬으로 작성된 커널과 통신한다. 이 커널은 코드 블록을 실행하여 그 결과를 클라이언트로 보내는 역할을 한다. 코드와 그 실행 결과는 ‘노트북’형식으로 서버에 저장된다. ‘노트북’ 형식은 여러 개의 ‘셀(cell)’로 구성된 텍스트 JSON 파일로, 각각의 ‘셀’은 HTML, 마크다운, 간단한 텍스트 노트 또는 실행 가능한 코드를 포함한다.
- 최근 연구에 따르면 교실에서 Jupyter를 사용하면 대화형 인터페이스 덕분에 코딩에 익숙하지 않은 학생들이 코딩을 효과적으로 쉽게 배울 수 있다고 한다.
명령줄 애플리케이션
명령줄 애플리케이션은 텍스트 인터페이스에서 사용하도록 설계된 컴퓨터 프로그램으로, 셸이 그 예이다. 명령줄 애플리케이션은 pep8이나 virtualenv처럼 간단한 명령어 모음일 수도 있고, python 인터프리터나 ipython과 같은 대화형 프로그램일 수도 있다.
argparse
argparse는 명령줄 옵션을 파실할 수 있도록 돕는 파이썬 표준 라이브러리이다. HowDoI 프로젝트의 명령줄 인터페이스는 argparse를 사용해 만들어졌으니, 명령줄 인터페이스를 만들 때 HowDoI의 인터페이스를 참고해도 좋다.
docopt
docopt의 핵심 철학은 문서는 아름답고 이해하기 쉬워야 한다는 것이다. 이 라이브러리는 하나의 주 명령 docopt.docopt()을 제공한다. 이에 더하여 고급 사용자가 유용하고 편리하게 쓸 몇 가지 함수와 클래스를 제공한다.
Plac
Plac의 철학은 명령줄을 파싱하는 데 필요한 모든 정보는 대상 함수의 시그니처에 있다는 것이다. Plac은 파이썬 표준 라이브러리의 argparse를 래핑하는 200줄 정도의 가벼운 코드로, 단일함수 plac.plac()을 제공한다.
Click
Click의 주된 용도는 개발자가 가능한 한 적은 코드로 구성할 수 있는 명령줄 인터페이스를 만들 수 있도록 돕는 것이다. Click의 기본 설정은 대부분 개발자의 요구를 충족시키지만, 고급 사용자를 위한 설정도 충분히 가능하다. Click은 Plac과 마찬가지로 데코레이터를 통해 파서 정의와 함수를 연결하며, 명령줄 인자 관리를 함수 외부에서 할 수 있도록 한다.
Clint
Clint 라이브러리는 명령줄 인터페이스 도구 모음이다. Clint는 명령줄 인터페이스의 색상과 들여쓰기 설정, 간단하고 강력한 표 형식 출력 도구, 이터레이터 기반의 진행 표시줄, 함축적인 인자 관리 기능을 지원한다.
GUI 애플리케이션
위젯 라이브러리
GUI 개발 관점에서 보았을 때, 버튼, 슬라이더, 스크롤바 같이 자주 사용되는 UI제어 및 디스플레이 요소를 통칭하여 위젯이라 한다. 위젯 라이브러리를 사용한다면 로우레벨 코딩이나 작업에 대한 걱정이 없어진다.
TK
파이썬 표준 라이브러리의 Tkinter 모듈은 TK에 의존하는 객체지향 레이어다. TK는 Td ㅇ너어로 작성한 위젯 라이브러리이며, 보통 이 둘을 묶어 Tcl/Tk라 부른다. Tkinter는 표준 라이브러리에 포함되어 있으므로 GUI 툴킷 중 가장 간편하고 호환성이 좋다.
Kivy
Kivy는 멀티터치를 지원하는 미디어가 풍부한 애플리케이션을 개발하는 데 사용할 수 있는 파이썬 라이브러리이다. Kivy는 커뮤니티에서 활발하게 개발되고 있으며, BSD와 비슷하면서 관대한 라이선스를 가진다. 모든 주요 플랫폼(리눅스, 맥, 윈도우, 안드로이드)에서 작동한다.
Qt
Qt(‘큐트’라고 발음)는 GUI를 가지는 소프트웨어를 개발하는 데 널리 사용되는 크로스 플랫폼 애플리케이션 프레임워크이며, GUI가 없는 애플리케이션을 개발할 때 사용할 수도 있다.
GTK+
GTK+ 툴킷은 GNOME 데스크톱 환경의 백보을 위한 API를 제공한다. C를 선호하며 GTK+의 소스 코드를 보는게 편안한 프로그래머, GNOME 애플리케이션을 작성해 왔거나 해당 API에 친숙한 프로그래머라면 필요에 따라 Qt 대신 GTK+를 선택할 수 있다.
wxWidgets
wxWidgets의 디자인 철학은, 애플리케이션이 고유의 모양과 느낌을 가지려면, 운영체제별로 고유의 API를 사용하는 게 최선이라는 입장이다. Qt와 GTK+는 x11 대신 다른 창 생성 라이브러리를 사용할 수 있지만, Qt는 라이브러리를 추상화하고 GTK는 사용자가 GNOME을 프로그래밍하는 것 처럼 만든다. wxWidgets는 각 플랫폼과 직접 인터페이스 할 수 있는 게 장점이며, 라이선스가 훨씬 관대하다. 그러나 플랫폼마다 약간씩 다르게 처리해야 한다는게 단점이다.
오브젝티브 - C
오브젝티브-C는 맥과 IOS 운영체제를 위해 애플이 사용하는 독점 언어이며, 이를 통해 맥에서의 애플리케이션 개발에 사용하는 코코아 프레임워크에 접근 할 수 있다. 다른 도구와 달리, 오브젝티브-C는 크로스 플랫폼이 아니며, 애플 제품만을 위한 도구이다.
Subscribe via RSS