_python hashlib中的sha导入

_python hashlib中的sha导入,python,hashlib,Python,Hashlib,今天我检查了python中的hashlib模块,但是我发现了一些我仍然无法理解的东西 在这个python模块中,有一个我无法理解的导入。我是这样说的: def __get_builtin_constructor(name): if name in ('SHA1', 'sha1'): import _sha return _sha.new 我试图从python shell导入sha模块,但似乎无法通过这种方式实现。我的第一个猜测是它是一个C模块,但我不确定

今天我检查了python中的hashlib模块,但是我发现了一些我仍然无法理解的东西

在这个python模块中,有一个我无法理解的导入。我是这样说的:

def __get_builtin_constructor(name):
    if name in ('SHA1', 'sha1'):
        import _sha
        return _sha.new
我试图从python shell导入sha模块,但似乎无法通过这种方式实现。我的第一个猜测是它是一个C模块,但我不确定


告诉我,你们知道那个模块在哪里吗?它们是如何导入的?

似乎您正在安装python,它在_haslib而不是_sha(两个C模块)中编译了sha。从python 2.6中的hashlib.py:

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

实际上,_-sha模块是由shamodule.c提供的,_-md5是由md5module.c和md5.c提供的,只有在默认情况下Python没有使用OpenSSL编译时,才会构建这两个模块

您可以在Python源代码tarball的
setup.py
中找到详细信息

    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']) )
通常,Python是用Openssl库构建的,在这种情况下,这些函数由Openssl库本身提供

现在,如果您希望将它们分开,那么您可以在不使用OpenSSL的情况下构建Python,或者更好的情况是,您可以使用pydebug选项构建Python并拥有它们

从Python源代码tarball:

./configure --with-pydebug
make
你看:

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

那么,有没有一种方法可以在hashlib之外导入该模块表单呢?是的,导入
\u hashlib
(注意下划线)<代码>\u sha似乎是一个遗留接口,如果安装了
\u hashlib
,则不会安装该接口。出于好奇,为什么要导入它?我很好奇XD。但现在我明白了它的工作原理!谢谢你的帮助!:帕尔伯托夫、费尔南多:哈什利布和沙是唯一的。我指出了setup.py中实际发生的机制。尽管如此,只有当您没有合适的openssl时,才会构建\u hashlib。恐怕这不是一个完全正确的答案。事实上,森希尔的答案更完整。我把费尔南多帖子中的“他们如何导入它?”部分误读为“我如何导入它”,所以我的回答想指出“你不能,因为你的安装是通过_hashlib模块提供的”。你的答案信息更丰富,因此我投赞成票。谢谢:)