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?

¿Fue útil?

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')
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top