Frage

Nun, heute habe ich das Hashlib -Modul in Python überprüft, aber dann habe ich etwas gefunden, das ich immer noch nicht herausfinden kann.

In diesem Python -Modul gibt es einen Import, dem ich nicht folgen kann. Ich geht so:

def __get_builtin_constructor(name):
    if name in ('SHA1', 'sha1'):
        import _sha
        return _sha.new

Ich habe versucht, das _SHA -Modul aus einer Python -Shell zu importieren, aber es scheint, dass es nicht so erreicht werden kann. Meine erste Vermutung ist, dass es sich um ein C -Modul handelt, aber ich bin mir nicht sicher.

Also sag mir, Jungs, weißt du, wo das Modul ist? Wie importieren sie es?

War es hilfreich?

Lösung

Tatsächlich wird das _SHA -Modul von Shamodule.c und _md5 von MD5Module.c und MD5.C bereitgestellt und beide werden nur dann erstellt, wenn Ihr Python nicht standardmäßig mit OpenSSL zusammengestellt wird.

Sie finden die Details in setup.py In Ihrer Python -Quelle Tarball.

    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']) )

Meistens wird Ihr Python mit OpenSSL -Bibliothek gebaut, und in diesem Fall werden diese Funktionen von den OpenSSL -Bibliotheken selbst bereitgestellt.

Wenn Sie sie getrennt haben möchten, können Sie Ihre Python ohne OpenSSL oder besser bauen, Sie können mit Pydebug -Option bauen und sie haben.

Aus Ihrer Python -Quelle Tarball:

./configure --with-pydebug
make

Und da gehen Sie:

>>> import _sha
[38571 refs]
>>> _sha.__file__
'/home/senthil/python/release27-maint/build/lib.linux-i686-2.7-pydebug/_sha.so'
[38573 refs]

Andere Tipps

Scheint, dass Ihre Python -Installation SHA in _haslib anstelle von _SHA (beide C -Module) zusammengestellt hat. Von Hashlib.py in 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')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top