2011-01-04 2 views
3

Ну, сегодня я проверял модуль hashlib на python, но потом нашел то, что я до сих пор не могу понять._sha import in python hashlib

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

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

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

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

ответ

8

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

Вы можете найти информацию в setup.py в вашем исходном tar-файле 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'])) 

Чаще всего, ваш 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] 
5

Кажется, что вы устанавливаете 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') 
+0

Итак, есть ли способ, что я могу сделать импорт этого модуля формы вне hashlib? – FernandoEscher

+0

yep, import '_hashlib' (обратите внимание на символ подчеркивания). '_sha' кажется устаревшим интерфейсом, который не установлен, если' _hashlib'. Из любопытства, зачем вы хотите его импортировать? – albertov

+0

Мне было любопытно XD. Но теперь я понимаю, как это работает! Спасибо за помощь! : P – FernandoEscher