Notebook
Notebook 환경은 이미 파이썬 환경 안에 있기 때문에 가상 환경은 활성화 할 수 없습니다.
!mkdir workspace
# 아래 URL의 내용을 .gitignore라는 이름의 파일에 저장 # 환경에 따라 키워드를 바꾸어 내용을 편집함 # https://www.gitignore.io/api/macos,python !git add .
!git commit -m '.gitignore를 추가'
$ git remote add origin \ git@github.com:<YOUR_ACCOUNT>/lgtm.git $ git push -u origin master
Notebook 환경은 이미 파이썬 환경 안에 있기 때문에 가상 환경은 활성화 할 수 없습니다.$ python3 -m venv venv $ . venv/bin/activate
!mkdir lgtm
(주:lgtm/core.py) import click @click.command() def cli(): """LGTM 이미지 생성 도구""" lgtm() click.echo('lgtm') # 동작 확인용 def lgtm(): # 여기에 로직을 추가함 pass(주:main.py) from lgtm import core if __name__ == '__main__': core.cli()(venv) $ python3 main.py lgtm!git add .!git commit -m '프로젝트 모형 작성'(venv) $ git push
(주:tests/test_core.py) import unittest class LgtmTest(unittest.TestCase): def test_lgtm(self): from lgtm.core import lgtm self.assertIsNone(lgtm())# 단위 테스트 실행 (venv) $ python -m unittest -v test_lgtm (test_core.LgtmTest) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.017s OK!git add .!git commit -m 'core 모듈 테스트 작성'(venv) $ git push
!git add .!git commit -m 'CircleCI 설정 파일 추가'(venv) $ git push
(주:lgtm/core.py) @click.command() @click.option('--message', '-m', default='LGTM', show_default=True, help='이미지에 추가할 문자열') @click.argument('keyword') def cli(keyword, message): """LGTM 이미지 생성 도구""" lgtm(keyword, message) click.echo('lgtm') # 동작 확인용 def lgtm(keyword, message): # 여기에 로직을 추가함 pass
!git add .!git commit -m '커맨드 라인 인수를 받음'(venv) $ git push
(주:tests/test_core.py) (생략) def test_lgtm(self): from lgtm.core import lgtm self.assertIsNone(lgtm('./python.jpeg', 'LGTM'))(venv) $ python3 -m unittest -v test_lgtm (test_core.LgtmTest) ... ok ---------------------------------------------------------------------- Ran 1 test in 0.017s OK!git add .!git commit -m 'lgtm/core.py 변경에 따른 테스트 수정'(venv) $ git push
(주:lgtm/image_source.py) from io import BytesIO import requests class LocalImage: """파일로부터 이미지를 얻음""" def __init__(self, path): self._path = path def get_image(self): return open(self._path, 'rb')
(주:lgtm/image_source.py) (생략) class RemoteImage: """URL로부터 이미지를 얻음""" def __init__(self, path): self._url = path def get_image(self): data = requests.get(self._url) # 바이트 데이터를 파일 객체로 변환 return BytesIO(data.content)
(주:lgtm/image_source.py) (생략) class _LoremFlickr(RemoteImage): """검색 키워드로부터 이미지를 얻음""" LOREM_FLICKR_URL = 'https://loremflickr.com' WIDTH = 800 HEIGHT = 600 def __init__(self, keyword): super().__init__(self._build_url(keyword)) def _build_url(self, keyword): return (f'{self.LOREM_FLICKR_URL}/' f'{self.WIDTH}/{self.HEIGHT}/{keyword}') KeywordImage = _LoremFlickr
from importlib import reload reload(Image) reload(ImageDraw) from PIL import Image, ImageDraw # ローカル環境にある任意の画像パスを指定 file_path = '../dog.jpg' # ここではファイルパスの文字列を渡しているが # ファイルオブジェクトを渡してもよい image = Image.open(file_path) draw = ImageDraw.Draw(image) # 左上に"LGTM"を描画 draw.text((0, 0), 'LGTM') image.save('output.png', 'PNG')