본문 바로가기

IT/프로그래밍/Python

Python에서 Dropbox SDK를 빌드할때 발생하는 bug 해결책

Python에서 Dropbox sdk를 사용하는 app을 만들고 있는 와중에 py2app을 이용해서 빌드한 후 실행을 하면

테스트 과정중에서는 접하지 못했던 오류가 발생한다.

 NotImplementedError: resource_filename() only supported for .egg, not .zip

해결 방법을 찾아보다가 해당 링크에서 동일한 문제를 발견했다. 참조링크

(위 블로그의 작성자는 py2exe를 사용하였고 나같은 경우에는 py2app을 사용한 것이지만 어차피 distutils을 상속받아서 사용하기에 큰 차이점은 없다.)


참조링크의 방법을 이용해서 문제를 해결하였다.

프로그램의 오류가 발생하고 난 후에 osx에서 콘솔을 열면 프로그램 log 데이터들을 확인할 수 있는데 오류가 발생한

위치를 보면 dropbox sdkrest.py에서 오류가 발생한 것임을 알 수 있다. rest.py 를 수정하자.

해당 파일이 어디에 있는지 모르겠다면 아래의 코드를 이용해서 경로를 찾아보자.

import dropbox

dropbox.__path__

rest.py 를 열어서 코드를 변경하자

  • From
TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt')
  • To
try:  
    TRUSTED_CERT_FILE = pkg_resources.resource_filename(__name__, 'trusted-certs.crt')
except:  
    if hasattr(sys,'frozen'):
        resource_name = sys.prefix
        resource_name.strip('/')
        resource_name += '/trusted-certs.crt'
        TRUSTED_CERT_FILE = resource_name
        print "TRUSTED_CERT_FILE: ", TRUSTED_CERT_FILE
    else:
        raise


코드를 변경했으면 Compile 해서 rest.pyc 파일을 생성하자

import py_compile

py_compile.compile(“rest.py 가 있는 경로”)

여기까지 했다면 거의다 왔다. rest.pyc 파일까지 만들었다면 dropbox sdk 폴더내의 trusted-certs.crt

인증 파일을 복사해서 py2app 으로 빌드한 파일 내부에 직접 넣어주면 된다.


하지만 그건 번거로우니 py2app에서 빌드할때 사용되는 setup.py 파일 내부에 스크립트로 resorces에 저장되도록

작성해 주자. 빌드할 폴더 내부에 resource 폴더를 생성한 뒤 그 안에 위의 인증파일을 복사해 넣고 setup.py 파일에

DATA_FILES 옵션에 resource를 선언해 준다.

from setuptools import setup

APP = ['app.py'] #main file of your app
DATA_FILES = ['resource/']
OPTIONS = {
            ...
            }
setup(
    app=APP,
    data_files=DATA_FILES,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)

위와 같은 작업을 한 뒤에 다시 빌드를 해서 실행해 보면 아무런 문제없이 작동하는 것을 확인 할 수 있다.

(그런데 저 글 작성한게 2013년에 버전은 1.5.1 이었는데 현재 2015년에 2.2 버전에서도 동일한 문제가 발생한다. 뭐지.. -_-)


BlogWriter