El módulo de Shelve en Python no funciona: “no se puede determinar el tipo de db”

Estoy tratando de hacer un progtwig simple de almacenamiento de contraseñas en Python, y parece bastante simple, así que me pregunto si estoy usando la estantería incorrecta.

Tengo el archivo principal .py:

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() 

Y el otro archivo, passwords_dict.py, es solo un diccionario vacío.

Pero cuando bash ejecutar el progtwig, aparece este error:

 Traceback (most recent call last): File "passwords.py", line 3, in  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 

Cuando trato de usar anydbm en su lugar, me sale este error:

 Traceback (most recent call last): File "passwords.py", line 3, in  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 

Y cuando trato de usar dbm en su lugar, me sale este error:

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

¿Qué estoy haciendo mal? ¿Hay otra forma de almacenar un diccionario y aún así poder extraer claves usando la entrada del usuario (en lugar de todo el diccionario, que supongo que es lo que Pickle hace)?

Creo que no estás entendiendo cómo funciona el módulo de almacenamiento. Abre un archivo de base de datos. Cuando intenta abrir un archivo existente que contiene una secuencia de comandos de Python, está intentando detectar qué tipo de base de datos contiene el archivo (ya que la plataforma admite múltiples bases de datos de back-end).

Creo que en cambio quieres algo como esto:

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

Esto creará un nuevo archivo en el mismo directorio que su script llamado password_db. donde es una extensión de archivo de base de datos específica de la implementación.

También he experimentado este problema. Parece estar relacionado con condiciones no documentadas para el argumento de filename de filename de shelve.open . Actualmente es muy intransparente (por ejemplo, shelve.open("/tmp/tmphTTQLda") funciona mientras que shelve.open("/tmp/tmphTTQLd") no lo hace). El fracaso y el éxito de los nombres de archivo variables son difíciles de predecir. Solicité una explicación en forma de mejora de documentación en http://bugs.python.org/issue23174 .

En mi caso, abrir un dictado exterior persistente y pasarlo a la shelve.Shelve obras, por ejemplo, código

 a = dumbdbm.open(tempfile.mkstemp()[1]) b = shelve.Shelf(dict=a) 

y haz con b lo que shelve.open hecho con el valor de retorno de shelve.open .

Hay un error con anydb https://bugs.python.org/issue13007 que no pudo usar la identificación correcta para los archivos gdbm .

Entonces, si está intentando abrir un archivo gdbm válido con archivador y está detectando ese error, use esto en su lugar:

  mod = __import__("gdbm") file = shelve.Shelf(mod.open(filename, flag)) 

Más información sobre esta pregunta: no se pudo determinar el tipo de db de shelve, whichdb no reconoce gdb