Python
에서 Dropbox sdk
를 사용하는 app을 만들고 있는 와중에 py2app
을 이용해서 빌드한 후 실행을 하면
테스트 과정중에서는 접하지 못했던 오류가 발생한다.
NotImplementedError: resource_filename() only supported for .egg, not .zip
해결 방법을 찾아보다가 해당 링크에서 동일한 문제를 발견했다. 참조링크
(위 블로그의 작성자는 py2exe
를 사용하였고 나같은 경우에는 py2app
을 사용한 것이지만 어차피
distutils
을 상속받아서 사용하기에 큰 차이점은 없다.)
참조링크의 방법을 이용해서 문제를 해결하였다.
프로그램의 오류가 발생하고 난 후에 osx에서 콘솔을 열면 프로그램 log 데이터들을 확인할 수 있는데 오류가 발생한
위치를 보면 dropbox sdk
의 rest.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 버전에서도 동일한 문제가 발생한다. 뭐지.. -_-)
'IT/프로그래밍 > Python' 카테고리의 다른 글
Python 에서 Dropbox SDK 이용하기 (0) | 2015.08.17 |
---|---|
PyCrypto를 이용해서 AES방식으로 암호화 하기 (0) | 2015.08.07 |
Python에서 I18N 적용하기 (0) | 2015.06.21 |
Python 두가지 상속 방법의 차이점 (0) | 2015.06.20 |
Mac환경에서 python으로 clipboard 값 가져오기 (0) | 2015.02.28 |