Нет модуля с именем "passlib"

Как исправить

from passlib.hash import sha256_crypt ImportError: Нет модуля с именем "passlib"

Я уже установил в использовании pip install passlib и он говорит

Требование уже выполнено (используйте --upgrade для обновления): passlib в c:\python34\lib\site-packages Очистка...

Как вы это исправите

Спасибо

2 ответа

Существует проблема разрешения импорта с помощью passlib, но я ожидал, что он не найдет sha256_crypt вместо того, чтобы не найти passlib. Во-первых, я хотел бы убедиться, что на вашей машине правильно установлен модуль passlib. Во-вторых, я бы попытался запустить программу с ошибкой и посмотреть, можно ли запустить что-то вроде:

sha256_crypt.encrypt("someString")

Если это выполняется, то единственной "проблемой" является то, что разрешение импорта является статическим и оно не может разрешать функции, которые не определены во время выполнения. Это будет иметь смысл, если вы посмотрите на hash.py из passlib.

    # NOTE: could support 'non-lazy' version which just imports
#       all schemes known to list_crypt_handlers()

#=============================================================================
# import proxy object and replace this module
#=============================================================================

from passlib.registry import _proxy
import sys
sys.modules[__name__] = _proxy

#=============================================================================
# eoc
#=============================================================================

Как видите, sha256_crypt здесь не определен, поэтому импорт возвращается как неправильный, даже если модуль будет загружаться правильно во время выполнения!

У вас есть два варианта на данный момент. Если вы используете PyDev, как я, вы можете добавить флаг игнорирования рядом с импортом:

from passlib.hash import sha256_crypt #@UnresolvedImport

Вы также можете изменить hash.py так, чтобы вы определили функцию-заполнитель sha256_crypt, чтобы гарантировать, что импорт возвращается как допустимый, но на самом деле это не лучший подход, но он работает:

# NOTE: could support 'non-lazy' version which just imports
#       all schemes known to list_crypt_handlers()

#=============================================================================
# import proxy object and replace this module
#=============================================================================

def sha256_crypt():
        pass

from passlib.registry import _proxy
import sys
sys.modules[__name__] = _proxy

#=============================================================================
# eoc
#=============================================================================

Это гарантирует, что процесс разрешения импорта увидит, что функция существует, и не будет жаловаться.

Возможно, у вас есть виртуальная среда и вы установили в нее свои модули, но IDE запустили в глобальной среде. См. следующий ответ , который решил эту проблему для меня.

Другие вопросы по тегам