Импорт _sha в хеш-библиотеку Python

Что ж, сегодня я проверял модуль hashlib в питоне, но потом нашел кое-что, в чем до сих пор не могу разобраться.

Внутри этого модуля Python есть импорт, за которым я не могу следить. Я делаю так:

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

Я попытался импортировать модуль _sha из оболочки Python, но кажется, что таким образом его невозможно получить. Мое первое предположение состоит в том, что это модуль C, но я не уверен.

Так скажите мне, ребята, вы знаете, где этот модуль? Как они его импортируют?


person FernandoEscher    schedule 04.01.2011    source источник


Ответы (2)


На самом деле модуль _sha предоставляется shamodule.c, а _md5 предоставляется md5module.c и md5.c, и оба будут собраны только в том случае, если ваш Python не скомпилирован с OpenSSL по умолчанию.

Вы можете найти подробности в setup.py в tar-архиве Python Source.

    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.

Теперь, если вы хотите их отдельно, вы можете собрать свой Python без OpenSSL или, что еще лучше, вы можете собрать с опцией pydebug и иметь их.

Из вашего архива с исходным кодом Python:

./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]
person Senthil Kumaran    schedule 04.01.2011

Кажется, что ваша установка python имеет sha, скомпилированную внутри _haslib вместо _sha (оба модуля C). Из hashlib.py в 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')
person albertov    schedule 04.01.2011
comment
Итак, есть ли способ импортировать эту форму модуля вне hashlib? - person FernandoEscher; 04.01.2011
comment
да, импортируйте _hashlib (обратите внимание на подчеркивание). _sha кажется устаревшим интерфейсом, который не установлен, если _hashlib установлен. Из любопытства, почему вы хотите импортировать его? - person albertov; 04.01.2011
comment
Мне было любопытноXD. Но теперь я понимаю, как это работает! Спасибо за помощь! :П - person FernandoEscher; 04.01.2011
comment
Альбертов, Фернандо: _hashlib и _sha являются эксклюзивными. Я указал на механизм, который на самом деле имеет место в setup.py. Хотя _hashlib будет собран только тогда, когда у вас нет надлежащего openssl. Боюсь, если это не совсем правильный ответ. - person Senthil Kumaran; 04.01.2011
comment
На самом деле ответ Сентила более полный. Я неправильно понял, как они его импортируют? часть сообщения Фернандо «Как мне его импортировать», поэтому мой ответ хотел указать, что вы не можете, поскольку ваша установка предоставляет его через модуль _hashlib. Ваш ответ гораздо более информативен, поэтому мой голос. Спасибо :) - person albertov; 04.01.2011
comment
Любой префикс имени python с символом подчеркивания считается частным и может быть изменен между любыми версиями практически без предварительного уведомления. Вы не должны полагаться на эти имена вообще. - person Nathan Ernst; 04.01.2011
comment
Спасибо за ваши ответы! Вы почти все осветили. - person FernandoEscher; 04.01.2011