好吧,今天我在python中检查hashlib模块,但后来我找到了一些我仍然无法弄清楚的东西。
在这个python模块中,有一个我无法遵循的导入。我是这样的:
def __get_builtin_constructor(name):
if name in ('SHA1', 'sha1'):
import _sha
return _sha.new
我试图从python shell导入_sha模块,但似乎无法通过那种方式进行。我首先猜测它是一个C模块,但我不确定。
那么告诉我们,你知道那个模块在哪里吗?他们如何导入它?
答案 0 :(得分:9)
实际上,_sha模块由shamodule.c提供,而_md5由md5module.c和md5.c提供,并且只有在默认情况下没有使用OpenSSL编译Python时才会构建它们。
您可以在Python Source 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 Source 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]
答案 1 :(得分:5)
似乎你的python安装已经在_haslib而不是_sha(两个C模块)中编译。来自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')