2011-09-23 4 views
3

나는 OS X에서 파이썬 2.7.2로 개발 된 앱을 가지고있다. 나는 모듈 선반을 사용하고 mac에서 bsddb를 기본으로하는 것처럼 보인다. 모듈 bsddb가없고 ActiveState의 패키지 관리자 (pypm)에 없으므로 ActiveState python 2.7이 설치된 Windows 7 시스템에서 프로그램이 실행되지 않습니다. ActiveState의 문서는 v 2.6에서 더 이상 사용되지 않습니다. DB를 작성한 OS X 파이썬이 bsddb를 기본값으로 사용하기 때문에 bdddb를 시도합니다. shelve 데이터베이스를 삭제하고 Windows에서 실행하면 행복하게 다른 기본 데이터베이스가 사용됩니다. 맥의 파이썬 또한 행복하다.python shelve ... bsddb deprecated ... shelve에서 다른 데이터베이스를 사용하는 방법?

그래서 선반 용으로 비 bdsdb 백엔드를 사용해야한다고 생각합니다. gdbm 모듈과 같습니다. 하지만 그 방법을 해결할 수는 없습니다.

답변

2

내가 잘못된 질문을 한 것 같았다. 창 exe를 빌드 할 때, py2exe는 dbm 모듈을 포함하지 않았습니다 (이 종속성을 유추 할 수 없음). 따라서 런타임시 Python은 절망에 빠져서 bdbm 모듈을 찾으려고 시도했습니다.

이 스크립트 setup.py는 py2exe 버전이 정상적으로 실행되는 것처럼 동작하도록하는 모듈을 포함합니다. 그것은 DBM-복제 모듈 (기본 dumbdbm 모듈이 충분히

from distutils.core import setup 
import py2exe, sys, os 
from glob import glob 

sys.argv.append('py2exe') 
data_files = [("Microsoft.VC90.CRT", glob(r'C:\Program Files\Microsoft Visual Studio 9.0\VC\redist\x86\Microsoft.VC90.CRT\*.*'))] 
setup(
    data_files=data_files, 
    windows = ["cashflowSim.py"], 
    options={ 
     "py2exe":{"includes":["dumbdbm"]}}, 
     zipfile = None 
) 
3

shelve.open을 호출하기 전에 anydbm._defaultmod을 설정하여 생성되는 db 유형을 설정할 수 있습니다.

이것은 파이썬 2.6 (그리고 어쩌면 2.7?)에서 작동하지만, anydbm._defaultmod은 개인 변수이기 때문에 이것은 해킹임을 알고 있어야합니다. 예를 들어

anydbm._defaultmod=__import__('gdbm') 

는 :

import anydbm 
import whichdb 
import contextlib 

anydbm._defaultmod=__import__('gdbm') 
filename='/tmp/shelf.dat' 
with contextlib.closing(shelve.open(filename)) as f: pass 
result=whichdb.whichdb(filename) 

print(result) 
# gdbm 
+0

내가 가진 문제는 ActiveState의 파이썬을 사용하고 사용하여 윈도우 실행 파일을 만들려고 노력 창에 좋다 그래서 나는 단지 10 개 간단한 사전을 저장하고있어이 포함 py2exe. shelve를 사용하면 bsddb가로드되기 때문에 실행 파일이 실패합니다. 프로그램을 python program.py로 실행하면 문제가 발생합니다. 위의 해킹을 사용하면 아무런 차이가 없습니다. –

+0

기존 파일을 만들거나 새 파일을 만들 때 – unutbu

+0

shelve 데이터베이스를 삭제하면 문제가 발생하지 않습니다. 2004 년에 게시판을 찾아서 py2exe를 작동 시키려면 dbm 복제본을 명시 적으로 포함해야합니다. 옵션을 통해 dubmdbm을 ​​포함 시키십시오. { "py2exe": { "includes": [ "dumbdbm"]}}, i n setup.py 스크립트. –

관련 문제