'Python'에 해당되는 글 5건

  1. 2014.06.26 #20140626-01 :: aptana3 :: Google App Engine directory on Aptana Studio 3
  2. 2013.02.09 #20130209-01 :: Python :: Mac OS X Mountain Lion에서 site-packages 문제
  3. 2012.02.23 [S3] key.copy와 bucket.copy_key에서 발생하는 NoSuchKey 에러
  4. 2012.02.23 [Python] 특정 폴더들을 찾아 삭제하기
  5. 2011.12.30 [Python] 텍스트 파일 인코딩 변경

#20140626-01 :: aptana3 :: Google App Engine directory on Aptana Studio 3

Aptana Studio 3에서 Google App Engine 프로젝트를 만들게 되면,

Google App Engine Directory를 요구합니다.


Mac OS X에서는 프로그램이 *.app으로 패키징 되어있기 때문에

Aptana3의 Browse 버튼으로는 요구하는 위치를 설정할 수 없습니다.


그래서 아래의 경로를 입력창에 직접 입력합니다.


/Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/


#20130209-01 :: Python :: Mac OS X Mountain Lion에서 site-packages 문제

현재 집에서 Mac OS X Mountain Lion을 사용 중입니다.

벤처를 그만둔 이후 한동안 웹 개발에서 손을 놓았었으나

간만에 심심풀이 땅콩이나 할까하여 Aptana, django, boto를 다시 꺼내들었습니다.


그런데 문제가 발생했습니다. 

터미널에서 실행한 python 콘솔에서 설치된 django와 boto를 읽어오지 못하는 것이었습니다.

확인한 결과 원인은 "python setup.py install"로 설치되는 site-packages 경로와 

터미널이 읽어오는 site-packages 경로가 다르다는 것이었습니다.

뭐... 이런 거지같은 ㅋ


다음과 같이 문제를 해결합니다.


$ cd /Library/Python/2.7

$ sudo mv site-packages site-packages.origin

$ sudo ln -s /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages site-packages


터미널을 닫은 후 재실행하니 django와 boto가 정상적으로 import 됩니다.


[S3] key.copy와 bucket.copy_key에서 발생하는 NoSuchKey 에러


배경:

아마존의 클라우드 서비스를 프로젝트에 적용하면서, 프로젝트가 Python 기반의 장고이기에 AWS를 제어하기 위하여 boto를 사용하고 있다. 지금까지는 무탈하게 사용하여 왔으나, S3의 데이터를 다른 위치로 복사하는 기능을 구현하기 위하여 작업하던 중 난감한 에러를 만나게 되었다.
복사를 위하여 Key의 copy와 Bucket의 copy_key를 모두 사용하여 보았는데, 지속적으로 아래와 같은 에러를 발생하는 것이었다.

S3ResponseError: 404 Not Found

<Error>

<Code>NoSuchKey</Code>

<Message>The specified key does not exist.</Message>

<Key>/path/of/file/in/bucket</Key>

<RequestId>****************</RequestId>

<HostId>****************************************************************</HostId>

</Error>


특별히 사용법이 어려운 것도 아니고, 개인적으로 오픈소스를 무한 신뢰하는 성격이라서 boto를 최신 버전으로 업데이트까지 해가며 몇 시간을 삽질하다가 결국 boto의 함수를 직접 열어 보았다.


환경:
Mac OS X Lion
Python 2.6
boto 2.2.2


원인:
본인은 일반적으로 bucket의 key를 열 때, 키의 문자열을 다음과 같이 만들어 연다.
대부분의 API에서는 아래와 같이 사용했을 때, key도 바르게 열리고 문제가 발생하지 않는다.

keypath = os.path.join('/', project_id, filename)

 
그런데 문제는 copy와 copy_key API 내부에서 복사 리퀘스트를 날릴 때, bucket 이름과 key를 연결하여 인자로 날리는데, 위와 같이 key를 지정할 경우 'bucket//project_id/filename'으로 인자를 만들어 날리고, S3에서는 존재하지 않는 key라고 응답을 하는 것이다. 이런 황당할 때가...


해결:
코드를 아래와 같이 수정한다.

keypath = os.path.join(project_id, filename)

 
 

이걸 버그라고 신고해야하나 말아야 하나... ㅋ 


[Python] 특정 폴더들을 찾아 삭제하기


배경:
현재 주요 프로젝트 환경의 구성에 있어서 개발 서버에는 SVN을 두고, 로컬은 Mac OS X에서 git으로 소스코드를 관리하고 있다. 다만, 웹 디자이너와의 협업은 FTP를 통해 이루어지는데, 이번에 여러 사정으로 .svn 파일들이 로컬 작업 공간에 모두 복사되었다. 
수 많은 폴더들을 하나씩 열어가며 삭제하는 것은 정신나간 짓이기에 재귀적으로 .svn 폴더를 찾아 삭제하는 스크립트를 짜기로 했다. Mac OS는 유닉스 계열 커널이므로 굳이 Python을 사용하지 않고 쉘스크립트를 이용해도 되지만, 본인은 쉡스크립트 프로그래밍을 현재 모르는 상태이기에 Python을 이용하였다.

환경:
Mac OS X Lion
Python 2.6

해법:
현재 디렉토리를 기준으로 재귀적으로 .svn 폴더를 찾아 모두 삭제한다.

코드:

import os


def remove_all(root):

for base, dirs, files in os.walk(root, topdown=True):

for name in files:

next = os.path.join(base, name)

print 'F: ' + next

os.remove(next)

for name in dirs:

next = os.path.join(base, name)

print 'D: ' + next

remove_all(next)

os.rmdir(next)


def remove_svn(root):

for base, dirs, files in os.walk(root, topdown=True):

for name in dirs:

next = os.path.join(base, name)

if name == '.svn':

print 'D: ' + next

remove_all(next)

os.rmdir(next)

else:

remove_svn(next)


remove_svn(os.path.abspath(os.path.dirname(__file__)))

 
위 코드를 remove_svn.py라는 파일로 저장하여 커맨드라인에서 동작시켰으며, 문제없이 잘 동작하였다.
 

[Python] 텍스트 파일 인코딩 변경


배경:
몇달 전 64비트 윈도우의 필요로 Windows 7 Ultimate 영문판을 설치했다. 한글 사용을 위해서는 한글팩을 설치하고 언어환경을 변경해 주어야 하지만, 귀찮았다. -_-;;; 몇몇 국내 프로그램들의 미개한 언어셋 문제로 불편을 겪긴 하지만, 중요한 문제는 아니었기에 그냥 넘어갔으나 미드 자막을 보는데 있어 곤경에 처하게 되었다. 윈도우의 기본 한글 언어셋(cp949)에서 만들어진 자막이 영문 윈도우에서 똑바로 보이지 않는 문제가 있는 것이다. 테스트 결과 자막을 UTF-8로 변경하면 문제가 없었다. 그러나 그 많은 자막을 손수 인코딩 하는 것은 맨정신에는 곤란한 일이라고 생각된다.

환경:
Windows 7 Ultimate - ENG
Python 2.7

해법:
python을 이용하여 자막 파일을 찾아 인코딩하는 스크립트를 작성하기로 하였다.

전제:
소유하고 있는 모든 한글 자막은 cp949로 인코딩 되어있다.

코드:

# -*- coding: utf-8 -*-


import os

import os.path


rootpath = os.path.dirname( os.path.abspath( __file__ ) )


for basepath, dirs, files in os.walk(rootpath):

for filename in files:

if filename.endswith('.smi') or filename.endswith('.srt'):

filepath = os.path.join(basepath, filename)

f = file(filepath, 'r')

s = f.read()

f.close()


import shutil

shutil.copyfile(filepath, filepath + '.bak')


f = file(filepath, 'w')

f.write(unicode(s, 'cp949', 'ignore').encode('utf-8'))

f.close()



위 코드를 utf8script.py라는 파일명으로 저장한 후 커맨드라인에서 실행 시켰다.
시험적으로 적용해 본 폴더에서는 만족스럽게 동작 하였으며,
현재 결과물과 함께 미드를 감상 중이다.