레이블이 Python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Python인 게시물을 표시합니다. 모든 게시물 표시

5/14/2018

Pyenv-virtualenv + virtualenvwrapper + autodir

Pyenv-virtualenv + virtualenvwrapper + autodir

배경

  • 오랜만에 Django project를 하나 만들어 볼까하는데 환경설정이 항상 문제다.
  • 그저 프로젝트 폴더에 virtualenv 만들어서 개발할 때마다 activate를 할수 있을 것이다.
  • 그런데 이게 괜히 불편해서 폴더 들어가면 자동으로 virtualenv를 activate 시켜주고 싶어졌다.
  • 사실 vagrant나 docker로 띄우면 개발환경이 아예 격리되기에 위같은 고민을 한번에 해결할수 있었을 것이지만…
아무튼 하기로 한거니 해보려고 했다.

문제와 목표

문제 1. virtualenv 폴더를 매번 찾기 귀찮다.

  • virtualenvwrapper를 이용하여, 한곳에 가상환경을 몰아넣고 alias로 가상환경을 불러온다.

문제 2. 해당 alias를 project name과 같게 해야하거나 기억해야한다.

문제 3. 개발할 때마다, CLI로 매번 가상환경을 불러와야함

  • 프로젝트 폴더 들어갈 때, 자동으로 virtualenv를 activate
  • (중요) 나갈때는 deactivate
반복되고 실수할 수 있는 것을 줄이자

결과

Zsh-autoenv를 사용하여 해결함

  • env file이 변경되면 처음에만 실행할 건지 묻게 됨
  • pyenv versions가 한줄에 표시되어 가독성이 좋지 않은 건 일단 넘어갔음
~/projects $ cd starbucks-between-us
Attempting to load unauthorized env file!
-rw-r--r--  1 erwre  staff  48  5 14 19:06 /Users/erwre/projects/starbucks-between-us/.autoenv.zsh

**********************************************

pyenv activate starbucks
echo $(pyenv versions)

**********************************************

Would you like to authorize it? (type 'yes') yes
system 3.6.4 3.6.4/envs/starbucks * starbucks (set by PYENV_VERSION environment variable)
~/projects/starbucks-between-us $
~/projects/starbucks-between-us $ cd ..
Attempting to load unauthorized env file!
-rw-r--r--  1 erwre  staff  40  5 14 19:07 /Users/erwre/projects/starbucks-between-us/.autoenv_leave.zsh

**********************************************

pyenv deactivate
echo $(pyenv versions)

**********************************************

Would you like to authorize it? (type 'yes') yes
system * 3.6.4 (set by /usr/local/var/pyenv/version) 3.6.4/envs/starbucks starbucks
~/projects $

과정

기존 개발 환경은 pyenv로 python 3.6.4를 global default로 사용 중이었다. 터미널은 iTerm+Zsh 조합을 쓰고 있다.
  1. smartcd : 설치가 번거로움
  2. direnv : directory를 벗어날 때, 적을 수 있는 스크립트 옵션이 없어보임( 예시에서는 폴더 들어갈 때, 스크립트에서 환경변수를 export 함. 폴더를 빠져나오니 사라지는 정도의 환경변수 정리만 지원하는 것으로 보임)
    • brew install로 설치 시, repo master와 버전이 다름
      • env.leave 기능(폴더 빠져나올 때 실행할 스크립트)을 지원하지 않음
    • pip로 설치하기에는 pyenv에 있는 특정 버전에만 설치되어 꼬일까봐 brew로 최대한 설치하려 했음
      • 합리적인 의심이 맞는건가?
      • 어차피 가상환경들어가서도 deactivate는 될텐데?
      • 그건 virtualenv로 생성된 환경이라 가능한거 아닌가라고 생각되었고 pip로 일단 시도는 안해봄
    • 성공!
    • zsh를 위해 autoenv를 wrapping 함
    • env.leave 기능이 반영되어 있어서 사용함
      • 정확히는 .autoenv.zsh.autoenv_leave.zsh로 파일 이름이 다름
    • 다만 설치는 brew나 pip를 사용할 수 없어 repo clone 해야함
      • 업데이트 시점을 알수 없어 버전 관리에 취약할 수 있음
      • git pull로 할수도 있지만, brew update나 pip update에 비하면 개별적인 패키지 관리는 번거롭다.

Furthermore

  • pyenv-virtualenv와 virtualenv 어느 것을 쓰는 게 적합할까?
    • pyenv에서 제공하는 virtualenv는 해당 pyenv를 들어가지 않고도 한눈에 확인이 가능하다.
    • 그래서 pyenv-virtualenv를 사용함
  • pyenv-virtualenv: prompt changing will be removed from future release. configureexport PYENVVIRTUALENVDISABLE_PROMPT=1' to simulate the behavior.`
    • pyenv-virtualenv에서는 prompt에서 가상환경을 변경하는 것을 제거할 예정이라고 함…
    • 왜일까는 덜 살펴보았는데, 쉘 환경마다 prompt 앞에 붙던 가상환경의 alias가 문제가 된 것으로 보인다. (대충 살펴봐서 정확하지 않습니다. 너무 발산하는 거 같아서 풀고자 하는 것에 집중했음)
    • 일단은 prompt 옵션을 ~/.zshrc에서 바꾸도록 했음
    • 아쉬운 건, activate 되었는지 prompt 상에서 확인하기가 어렵다는 것인데, autudir에서 pyenv version을 echo로 출력하면 쉽게 해결됨
  • pyenv-virtualenv로 가상환경을 만들면 pyenv versions에 두개가 추가된다. 사용중인 pyenv의 환경을 기반으로 virtualenv를 만들고 alias를 두는 형태로 보인다. 모르고 비활성화된 한쪽을 지웠다가 오류가 났음
$ pyenv versions
  system
  3.6.4
  3.6.4/envs/starbucks
* starbucks (set by PYENV_VERSION environment variable)

$ which python
/usr/local/var/pyenv/shims/python

$ pyenv which python
/usr/local/var/pyenv/versions/starbucks/bin/python

$ ll /usr/local/var/pyenv/versions
total 0
drwxr-xr-x  7 erwre  admin   224B  5 11 17:08 3.6.4
lrwxr-xr-x  1 erwre  admin    50B  5 11 18:00 starbucks -> /usr/local/var/pyenv/versions/3.6.4/envs/starbucks
  • 다른 사람과 협업하기에 개발 환경이 내 환경에 너무 의존적이지 않은가?
    • requirements.txt로 의존성 관리를 하여, pip install -r requirements.txt는 명시적으로 실행될 거기 때문에 문제가 되지 않음
    • dockerfile을 이용하여, 이 과정을 줄일 수도 있음
  • (추가 아이디어) pip freeze > requirements.txt를 프로젝트 폴더 빠져나갈 때마다 실행하면 어떨까?
    • 테스트 중이고 의도되지 않은 패키지들이 반영 될수도 있지만, 그건 commit을 안하면 될 문제고, 패키지 변경을 알려주는 측면에서는 더 좋지않을까?!
    • cd .. 를 이미 한 시점에서 pwd는 project 상위 폴더를 가리키고 있음
    • 그리고 보통 cd ..로 종료 안하고 터미널 자체를 끄거나 새로운 터미널 세션을 사용하는 경우가 많아 의도대로 프로젝트 종료 시점과는 일치하지 않을 수 있음
    • 프로젝트 진입 시점(는 매번 호출)으로 바꿔도 큰 문제가 없을거 같음

7/27/2015

[Python] / operator와 // (floor division) operator의 차이

// (floor division) 는 2.2 부터 도입됨. 3.x의 float division을 위한 준비로 보임.

floor 에 대한 의미를 더 알고 싶다면 floor function 참고.


2.x 에서는 기본적으로 차이가 없으나, from __future__ import division 를  안쓸 때의 이야기. 그렇지만 2.5까지 __future__를 쓸 수 있음.

/ 는 'classic' division 이지만, from __future__ import division 를 쓰면 3.x 처럼 float를 반환

3.x 에서는
  • / 는  float 를 반환하고,
  • //는 2.x 처럼 소수를 버린 int를 반환한다.

7/21/2015

Wrong merge sort

오늘 기술면접 때 쓴 Wrong merge sort.
주어진 과제는 def mergeSort(alist, blist): 를 완성하는 것. 내가 구현한건 merge sort가 아니였다!
nested for 문으로 시작했다가 아닌거 같아서 이런 식으로 작성하다 Timeout...
갑자기 Python 문법을 까먹었다 라 쓰고 공부하지 않는다로 읽는다
For statement에 ()를 써버려서 급하게 자바로 아래와 같은 로직의 코드를 짰다

다시 merge sort 만들면서 깨달은 것
  1. for statement에는 ()가 필요치 않다
  2. list add 기능은 append() 를 사용
  3. ++가 없다. +=1 을 사용
  4. random.shuffle은 return하지 않고 parameter를 섞음
  5. sorted는 new list를 return
  6. list copy는 alist[:]로 copy module 사용안하고 심플하게 가능


Updated


테스트 코드 포함! merge sort 코드는 여기를 참고



Outdated


아래의 코드에서 사용했던 예제에서 동작하지만, 실제로는 범위 검사를 먼저 안하면 비교에서 out of index error가 발생한다.
반복문을 줄이려면 이렇게하면 되겠지. 하지만 심플하게 나누는게 초기 접근에는 이와 같은 인덱스 문제를 줄일거 같다. 아무생각 없이 같은 로직이라고 축약했더니 이런 문제가.
더 큰 문제는 이게 merge sort가 아니라는거!



Outdated


리스트 한쪽이 먼저 끝났을 때의 처리 - out of index 문제 내포

나름 한다고 생각했었는데.. 기초가 너무 부족하다. 평소에도 계속 코딩을 해야된다는 생각을 하게되었다.

7/07/2015

[Python] 같은 이름을 가진 Parameter(파라미터)와 함수 내의 local variable(지역 변수)

결과적으로 다른 값을 가지면 다르고, 같은 값을 가지면 같은 것을 의미함

id 함수를 통해 이를 테스트 해볼 수 있다.

https://wikidocs.net/32 에서 id 항목을 참고
# id(변수명)은 메모리 위치를 출력, 이로 같은 위치에 있는 변수인지 확인


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
def parameter_local_variable_test(a):
 print("init : ", hex(id(a)))
 a = 10
 print("assign 10 to a : ", hex(id(a)))
 a = 5
 print("assign different value : ", hex(id(a)))
 a = 5
 print("same value : " ,hex(id(a)))
 
# >>> test(10)
# init :  0x6f43c0a0
# assign 10 to a : 0x6f43c0a0    # If argument is same with 10, not changed
# assign different value : 0x6f43c050   # changed
# assign same value : 0x6f43c050        # not changed
 
# >>> test(2)
# init :  0x6f43c020
# assign 10 to a : 0x6f43c0a0    # if argument is different with 10, changed
# assign different value : 0x6f43c050   # changed
# assign same value : 0x6f43c050        # not changed


[추가 자료] 파이썬 변수에 대한 이해를 돕는 링크. 그림과 코드만 봐도 쉽게 이해가 됨

2/28/2014

앱 엔진에 파이썬 프로젝트 올려보기


구글의 App engine tutorial with python 에 따라 진행하였음


database 사용하기 전까지 일단하고 deploy 해보았다.

http://wide-gecko-505.appspot.com/




app engine launcher가 있긴하나 ide하고 따로 노는거라 투박하고 따로 놀아서

sdk 깔고서 pycharm으로 진행하였는데 run deploy 다 됨

무엇보다 google 계정 저장해서 안귀찮다


deploy에서 자꾸 안됐었는데(error 403 authorize?)

https://console.developers.google.com/project 

가 아니라

https://appengine.google.com/

에서

약관 동의를 해줘야 된다

그럼 쉽게 deploy 완료.



App engine 모르고 그냥 해봤는데 하고 나니 

  • Api server
  • Web server
  • Admin server

  • Datasotre
    • Viewer
    • Indexes
    • Status
  • Memcache
  • Blobstore
  • Task Queue
  • Cron Jobs(반복 작업은 celery로 써봤는데, 리눅스 기능도 한번 써봐야 할듯)
  • XMPP
    • 메일 프로토콜인듯
  • Inbound Mail
    • Direct Marketing?
    • 아무튼 메일 보내주는 거인듯
  • Full text search
이런 것들을 서비스로 제공한다는 거구나!



이후  남은 예제 db, template, static file 도 다 해보아야겠다.