2013-05-23 3 views
6

파이썬에서 간단한 암호 저장 프로그램을 만들려고 노력 중이며 매우 간단하여 보이지 않게 쉘프를 잘못 사용하고 있는지 궁금합니다. 파이썬의 쉘브 모듈이 작동하지 않습니다 : "db 유형을 결정할 수 없습니다"

내가 메인 평 파일이 있습니다

import shelve 

passwords = shelve.open('./passwords_dict.py') 

choice = raw_input("Add password (a) or choose site (c)?") 

if choice[0] == 'a': 
    site_key = raw_input("Add for which site? ").lower() 
    userpass = raw_input("Add any info such as username, email, or passwords: ") 

    passwords[site_key] = userpass 

else: 
    site = raw_input("Which site? ").lower() 
    if site in passwords: 
     print "Info for " + site + ": " + passwords[site] 
    else: 
     print site, "doesn't seem to exist!" 

print "Done!" 

passwords.close() 

그리고 다른 파일, passwords_dict.py을, 단지 비어있는 사전이다. 내가하려고 할 때

Traceback (most recent call last): 
File "passwords.py", line 3, in <module> 
passwords = anydbm.open('passwords_dict.py') 
File "/usr/lib/python2.7/anydbm.py", line 82, in open 
raise error, "db type could not be determined" 
anydbm.error: db type could not be determined 

그리고 :

하지만이 프로그램을 실행하려고 할 때, 나는이 오류가 : 내가 대신 anydbm를 사용하려고하면

Traceback (most recent call last): 
File "passwords.py", line 3, in <module> 
passwords = shelve.open('passwords_dict.py') 
File "/usr/lib/python2.7/shelve.py", line 239, in open 
return DbfilenameShelf(filename, flag, protocol, writeback) 
File "/usr/lib/python2.7/shelve.py", line 223, in __init__ 
Shelf.__init__(self, anydbm.open(filename, flag), protocol, writeback) 
File "/usr/lib/python2.7/anydbm.py", line 82, in open 
raise error, "db type could not be determined" 
anydbm.error: db type could not be determined 

,이 오류가 발생합니다 대신 dbm을 사용하면 다음 오류가 발생합니다.

Traceback (most recent call last): 
File "passwords.py", line 3, in <module> 
passwords = dbm.open('./passwords_dict.py') 
dbm.error: (2, 'No such file or directory') 

무엇이 잘못 되었나요? 사전을 저장하고 사용자 입력을 사용하여 키를 추출 할 수있는 또 다른 방법이 있습니까 (필자가 생각하는 전체 사전이 아닌).

답변

5

선반 모듈이 어떻게 작동하는지 오해하고 있다고 생각합니다. 데이터베이스 파일을 엽니 다. 파이썬 스크립트가 포함 된 기존 파일을 열려고하면 쉘프가 여러 백엔드 데이터베이스를 지원하기 때문에 파일에 포함 된 데이터베이스 유형을 감지하려고합니다. <db>는 구현 고유 데이터베이스 파일 확장 곳이 password_db.<db>라는 스크립트와 같은 디렉토리에 새 파일을 생성합니다

import os 
import shelve 

curdir = os.path.dirname(__file__) 
passwords = shelve.open(os.path.join(curdir, 'password_db')) 

: 내가 생각

대신 당신이 뭔가를 할 수 있습니다.

0

이 문제도 발생했습니다. 이는 인수가 문서화되지 않은 조건 인 shelve.open과 관련이있는 것으로 보입니다. 현재 매우 투명합니다 (예 : shelve.open("/tmp/tmphTTQLda")이 작동하고 shelve.open("/tmp/tmphTTQLd")은 작동하지 않음). 가변 파일 이름의 실패와 성공은 예측하기 어렵습니다. 나는 형태 적으로 문서 향상을위한 설명을 http://bugs.python.org/issue23174에 요청했다.

내 경우에는 shelve 외부에 영구 선언문을 열고이를 shelve.Shelve 작품 (예 : 코드

당신이 shelve.open의 반환 값했던 것 무엇 b
a = dumbdbm.open(tempfile.mkstemp()[1]) 
b = shelve.Shelf(dict=a) 

및 않습니다.

+0

미안 해요, 무슨의 임시 파일이 선반에 유효한 GDBM 파일을 열려고 시도 할이 대신 그 오류를 사용 thorwing 그래서 경우

? 임시 파일이 이미있는 경우에도이 기능이 작동합니까? –

+0

'tempfile'은 표준 파이썬 모듈입니다. '임시 파일.mkstemp'는 정의에 따라 존재하는 파일을 생성해야합니다. –

관련 문제