라이브러리를 애플리케이션 디렉터리에 복사하여 C 확장이 없는 순수 Python 코드인 타사 라이브러리를 사용할 수 있습니다. 타사 라이브러리가 이미 내장되어 있고 런타임과 번들로 제공되는 경우 앱에 복사하지 않고 라이브러리를 사용할 수 있습니다.
타사 라이브러리는 C 확장이 없는 순수 Python 코드로 구현되어야 합니다. 라이브러리를 애플리케이션 디렉토리로 복사하면 애플리케이션 코드와 함께 App Engine에 업로드되므로 파일 할당량에 포함됩니다.
타사 라이브러리 복사
런타임과 번들로 제공되는 내장 라이브러리 목록에 없는 타사 라이브러리를 사용하려면 다음을 수행합니다.
디렉터리를 만들어
lib/
같은 타사 라이브러리를 저장합니다.mkdir lib
-t <directory>
플래그와 함께 pip(버전 6 이상)를 사용하여 이전 단계에서 만든 폴더에 라이브러리를 복사합니다. 예를 들면 다음과 같습니다.pip install -t lib/ <library_name>
Homebrew 문제
macOS에서 Homebrew Python을 사용하는 경우
pip install -t
를 실행하면 예외가 발생할 수 있습니다. 이 문제는 Python의 Homebrew 구성에서 알려진 Homebrew 설치 문제(Note on pip install --user
참조)와 관련이 있습니다. 이 문제를 해결하려면 다음과 같이 홈 디렉터리에~/.pydistutils.cfg
파일을 임시로 만듭니다.[install] prefix=
이 컨텍스트 외부에서 패키지를 설치할 수 없게 되므로 App Engine 애플리케이션용 패키지를 설치한 후에는 이 파일을 제거합니다.
appengine_config.py
라는 파일을app.yaml
파일과 같은 폴더에 만듭니다.appengine_config.py
파일을 수정하고vendor.add()
메서드에 라이브러리 디렉터리를 제공합니다.# appengine_config.py from google.appengine.ext import vendor # Add any libraries install in the "lib" folder. vendor.add('lib')
위
appengine_config.py
파일은lib
폴더가 있는 위치를 현재의 작업 디렉터리라고 간주합니다. 일부 경우(예: 단위 테스트)에는 현재 작업 디렉터리가 다를 수 있습니다. 오류를 방지하기 위해 다음을 사용하여lib
폴더로 전체 경로를 명시적으로 전달할 수 있습니다.vendor.add(os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib'))
복사한 라이브러리와 함께 pip
요구사항 파일 사용
pip
는 요구사항 파일이라고 하는 파일에서 설치할 라이브러리 목록을 읽을 수 있습니다. 요구사항 파일을 사용하면 앱의 새 개발 환경을 손쉽게 설정하고 라이브러리의 새 버전으로 업그레이드할 수 있습니다.
요구사항 파일은 라이브러리마다 줄 하나로 구성된 텍스트 파일로, 패키지 이름과 패키지 버전(선택사항, 기본값은 최신 버전)을 나열합니다.
Flask==0.10
Markdown==2.5.2
google-api-python-client
요구사항 파일에서 라이브러리를 설치하려면 -t lib
플래그와 함께 -r
플래그를 사용합니다.
pip install -t lib -r requirements.txt
런타임과 함께 번들로 제공되는 내장 타사 라이브러리 사용
타사 라이브러리가 App Engine Python 런타임과 함께 번들로 제공되는 내장 라이브러리 목록에 있는 경우 app.yaml
의 라이브러리 지시문 아래에 지정하기만 하면 됩니다. 예를 들면 다음과 같습니다.
libraries:
- name: PIL
version: "1.1.7"
- name: webob
version: "1.1.1"
App Engine은 배포 중에 요청된 라이브러리를 자동으로 제공합니다.
로컬 개발 서버에서 번들로 제공되는 내장 라이브러리 사용
런타임에서 제공하는 많은 내장 라이브러리는 로컬 개발 서버에 자동으로 제공됩니다. 일부 라이브러리를 로컬에 설치하려면 gcloud components install app-engine-python-extras
를 실행해야 합니다.
이 구성 요소가 필요함을 로컬 개발 서버가 감지하면 구성 요소의 설치를 요청하는 메시지가 표시됩니다. 다음의 내장 라이브러리는 로컬 개발 서버와 함께 사용하기 전에 로컬로 설치해야 합니다.
pip 명령어를 사용하면 Python 패키지 색인(PyPI)에서 이러한 패키지를 모두 설치할 수 있습니다.
sudo pip install lxml==2.3.5
플랫폼에 따라 이와 같은 라이브러리를 설치하기 위해 빌드 지원 도구와 Python 소스를 설치해야 할 수 있습니다.
- Linux에서는 패키지 관리자가 이러한 선행 조건을 제공할 수 있으며 사전 빌드된 라이브러리 버전을 제공할 수 있습니다.
- Windows에서는 사전 빌드된 버전용 설치 프로그램을 일반적으로 사용할 수 있습니다.
- macOS에서는 일부 패키지를 빌드하는 데 Xcode 명령줄 도구가 필요합니다.
개발 서버는 app.yaml
에 지정된 버전에 관계없이 로컬에 설치한 패키지 버전을 사용합니다. 원하는 경우 프로젝트에 virtualenv를 설정하여 정확한 패키지 버전을 제공합니다. virtualenv는 이러한 바이너리 패키지에 대해 로컬에서만 사용되며 배포된 후에는 애플리케이션에서 사용할 수 없게 됩니다. 타사 라이브러리를 더 추가하려면 라이브러리 설치에 설명되어 있는 방법을 사용합니다.
로컬 개발 서버에서 Django 사용
Django는 완전한 기능을 갖춘 Python용 웹 애플리케이션 프레임워크입니다. Django는 디스패치, 뷰, 미들웨어, 템플릿 구성요소 등을 비롯하여 상호 호환되는 전체 스택 구성요소를 제공합니다.
Django 데이터 모델링 인터페이스는 App Engine 데이터 저장소와 호환되지 않습니다. Django 애플리케이션에서 App Engine 데이터 모델링 라이브러리(db 또는 ndb)를 사용할 수 있습니다. 하지만 Django 데이터 모델링 인터페이스를 사용하는 타사 Django 애플리케이션(특히 Django 관리 애플리케이션)은 App Engine과 직접 호환되지 않을 수 있습니다.
Datastore 모델링 라이브러리(DB)가 기본값입니다. 대신 Django를 NDB 스토리지 API와 함께 사용하려면 'google.appengine.ext.ndb.django_middleware.NdbDjangoMiddleware',
를 Django settings.py
파일의 MIDDLEWARE_CLASSES
항목에 추가합니다.
일부 다른 미들웨어가 Datastore를 호출할 수 있고 해당 미들웨어가 이 미들웨어 전에 호출되는 경우 제대로 처리되지 않으므로, 추가 시 다른 미들웨어 클래스 앞에 삽입하는 것이 좋습니다.
프로젝트 문서에서 Django 미들웨어에 대해 자세히 알아볼 수 있습니다.
앱에서 Django를 사용 설정하려면 app.yaml
에 WSGI 애플리케이션과 Django 라이브러리를 지정합니다.
...
handlers:
- url: /.*
script: main.app # a WSGI application in the main module's global scope
libraries:
- name: django
version: "1.4"
DJANGO_SETTINGS_MODULE
환경 변수는 패키지를 가져오기 전에 Django 설정 모듈 이름(일반적으로 'settings'
)으로 설정해야 합니다.
Django 설정 모듈이 settings.py
가 아닌 경우 app.yaml
파일에서 DJANGO_SETTINGS_MODULE
환경 변수를 적절하게 설정합니다.
env_variables:
DJANGO_SETTINGS_MODULE: 'myapp.settings'
또는 Python 코드에서 환경 변수를 적절하게 설정합니다.
import os
# specify the name of your settings module
os.environ['DJANGO_SETTINGS_MODULE'] = 'myapp.settings'
import django.core.handlers.wsgi
app = django.core.handlers.wsgi.WSGIHandler()
로컬 개발 서버에서 matplotlib
사용
Matplotlib은 다양한 이미지 형식으로 그래프와 그림을 생성하는 표시 라이브러리입니다. App Engine에서는 매트플롯립 대화형 모드가 지원되지 않으며 여러 가지 다른 기능도 사용할 수 없습니다. 즉, 여러 Matplotlib 튜토리얼에서 제안하는 것처럼 pyplot.show()
를 사용할 수 없습니다. 대신 pyplot.savefig()
를 사용하여 cStringIO.StringIO
인스턴스인 출력 스트림 또는 Cloud Storage 클라이언트 라이브러리를 사용하여 Google Cloud Storage에 이미지 데이터를 써야 합니다.
Matplotlib을 사용하면 애플리케이션의 최상위 디렉터리에 배치되어야 하는 matplotlibrc
구성 파일을 사용하여 광범위한 맞춤설정을 수행할 수 있습니다. 또는 MATPLOTLIBRC
환경 변수를 애플리케이션 디렉터리에 상대적인 경로로 설정할 수 있습니다.
기본 백엔드는 AGG이며 지원되는 모든 형식(PNG(기본 형식), RAW, PS, PDF, SVG, SVGZ)의 파일을 쓸 수 있습니다. PIL
을 app.yaml
의 libraries
섹션에 추가하여 PIL 라이브러리를 사용할 수 있게 하면 AGG 백엔드는 JPEG 및 TIFF 이미지 형식 쓰기도 자동으로 지원합니다.
매트플롯립은 다양한 글꼴과 함께 제공되며 이 글꼴은 자동으로 사용 가능한 상태가 됩니다. 애플리케이션과 함께 커스텀 글꼴을 TTF 형식으로 업로드하고, TTFPATH
환경 변수를 애플리케이션 디렉터리의 상대 경로인 글꼴이 있는 경로로 설정하여 커스텀 글꼴을 사용할 수 있습니다. 자세한 내용은 app.yaml
참조 문서를 확인하세요.
여러 가지 매트플롯립 기능이 App Engine에서 지원되지 않습니다. 특히 다음 내용이 해당됩니다.
~/.matplotlib
디렉터리가 없습니다. 하지만 위에서 설명한 대로matplotlibrc
구성 파일을 배치할 대체 위치가 있습니다.- 대화형 백엔드 및 GUI 요소는 지원되지 않습니다.
- EMF, Cairo, GDK 백엔드는 지원되지 않습니다.
- 캐싱이 없으므로 많은 메커니즘이 정상적으로 캐시되는 데이터를 다시 계산하거나 다시 다운로드합니다. 중지된 특정 캐싱 메커니즘에는
matplotlib.font_manager.FontManager.findfont
에서 계산한 글꼴 데이터,matplotlib.cbook.get_sample_data
에서 다운로드한 샘플 데이터,matplotlib.finance.fetch_historical_yahoo
에서 다운로드한 재무 데이터가 포함되어 있습니다.- 캐싱이 없으므로
examples.download
를False
로 설정하지 않으면asfileobj=False
로[matplotlib.cbook.get_sample_data](http://matplotlib.org/api/cbook_api.html#matplotlib.cbook.get_sample_data)
를 호출할 수 없습니다.
- 캐싱이 없으므로
- 외부 명령어를 호출하는 모든 기능이 사용 중지되었습니다.
fontconfig
가 사용 중지되었습니다. 글꼴은 위에서 설명한 메커니즘을 통해 찾을 수 있습니다.- 텍스트 렌더링에 LaTeX를 사용할 수 없습니다.
text.usetex
를True
로 설정하면 작동하지 않습니다. - 외부 PostScript Distiller 프로그램을 사용할 수 없습니다.
ps.usedistiller
를ghostscript
또는xpdf
로 설정하면 작동하지 않습니다. - 외부 동영상 인코딩 프로그램을 사용할 수 없습니다.
matplotlib.animation.Animation.save
메서드가 작동하지 않으므로matplotlib.animation
패키지는 유용하지 않습니다. matplotlib.cbook.report_memory
함수와matplotlib.cbook.MemoryMonitor
클래스는 지원되지 않습니다.
matplotlib.test
함수가 사용 중지되었습니다.
다음 단계
- App Engine Python 런타임 환경 자세히 알아보기
- 내장된 타사 라이브러리 참조 검토