importación _sha en hashlib pitón
Pregunta
Pues bien, hoy me iba a registrar el módulo hashlib en Python, pero luego me encontré con algo que todavía no puedo averiguar.
Dentro de este módulo Python, hay una importación que no puedo seguir. I es la siguiente:
def __get_builtin_constructor(name):
if name in ('SHA1', 'sha1'):
import _sha
return _sha.new
He intentado importar el módulo _sha de una concha pitón, sino que se parece que no se pueda llegar a way.My primera suposición es que es un módulo C, pero no estoy seguro.
Así que dime chicos, ¿sabe dónde está ese módulo? ¿Cómo lo importan?
Solución
En realidad, el módulo _sha es proporcionada por shamodule.c y _md5 es proporcionada por md5module.c y md5.c y ambos se construirán sólo cuando el pitón no se compila con OpenSSL por defecto.
Puede encontrar los detalles en setup.py
en su paquete fuente de Python.
if COMPILED_WITH_PYDEBUG or not have_usable_openssl:
# The _sha module implements the SHA1 hash algorithm.
exts.append( Extension('_sha', ['shamodule.c']) )
# The _md5 module implements the RSA Data Security, Inc. MD5
# Message-Digest Algorithm, described in RFC 1321. The
# necessary files md5.c and md5.h are included here.
exts.append( Extension('_md5',
sources = ['md5module.c', 'md5.c'],
depends = ['md5.h']) )
Muy a menudo, el pitón se construye con librería OpenSSL y en ese caso, esas funciones son proporcionadas por las propias bibliotecas de OpenSSL.
Ahora, si quieres ellos por separado, entonces usted puede construir su Python sin OpenSSL o mejor aún, se puede construir con la opción pydebug y tienen ellos.
A partir de su paquete fuente de Python:
./configure --with-pydebug
make
Y hay que ir:
>>> import _sha
[38571 refs]
>>> _sha.__file__
'/home/senthil/python/release27-maint/build/lib.linux-i686-2.7-pydebug/_sha.so'
[38573 refs]
Otros consejos
Parece que estás instalación de Python ha compilado sha dentro _haslib en lugar de _sha (ambos módulos C). De hashlib.py en Python 2.6:
import _haslib:
.....
except ImportError:
# We don't have the _hashlib OpenSSL module?
# use the built in legacy interfaces via a wrapper function
new = __py_new
# lookup the C function to use directly for the named constructors
md5 = __get_builtin_constructor('md5')
sha1 = __get_builtin_constructor('sha1')
sha224 = __get_builtin_constructor('sha224')
sha256 = __get_builtin_constructor('sha256')
sha384 = __get_builtin_constructor('sha384')
sha512 = __get_builtin_constructor('sha512')