Python AttributeError: объект 'module' не имеет атрибута 'SSL_ST_INIT'

У меня не работает Python script:

Traceback (most recent call last):
  File "./inspect_sheet.py", line 21, in <module>
    main()
  File "./inspect_sheet.py", line 12, in main
    workbook_name=workbook_name,
  File "./google_sheets.py", line 56, in __init__
    self.login()
  File "./google_sheets.py", line 46, in login
    self.client = gspread.authorize(credentials)
  File "/usr/local/lib/python2.7/site-packages/gspread/client.py", line 335, in authorize
    client.login()
  File "/usr/local/lib/python2.7/site-packages/gspread/client.py", line 98, in login
    self.auth.refresh(http)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 598, in refresh
    self._refresh(http.request)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 769, in _refresh
    self._do_refresh_request(http_request)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 795, in _do_refresh_request
    body = self._generate_refresh_request_body()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1425, in _generate_refresh_request_body
    assertion = self._generate_assertion()
  File "/usr/local/lib/python2.7/site-packages/oauth2client/client.py", line 1554, in _generate_assertion
    private_key, self.private_key_password), payload)
  File "/usr/local/lib/python2.7/site-packages/oauth2client/crypt.py", line 162, in from_string
    from OpenSSL import crypto
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/__init__.py", line 8, in <module>
    from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python2.7/site-packages/OpenSSL/SSL.py", line 118, in <module>
    SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

Ответ 1

Оказалось, что проблема связана с моей установкой pyOpenSSL, pyOpenSSL-0.15.1.

Я сделал:

pip uninstall pyopenssl

а затем

pip install pyopenssl

... и мой Python script снова работает!

Ответ 2

Обновление pyopenssl с помощью pip не работало, поскольку ни одна из команд, связанных с pip, не работала для меня. Обновив pyopenssl с помощью easy_install, проблема может быть решена.

sudo python -m easy_install --upgrade pyOpenSSL

credit @delimiter (Answer)

Ответ 3

Обновите модуль pyopenssl:

$ sudo pip install -U pyopenssl

Ответ 4

У меня была похожая ошибка:

    from OpenSSL import rand, crypto, SSL
  File "/usr/local/lib/python3.5/dist-packages/OpenSSL/SSL.py", line 112, in <module>
    SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: module 'lib' has no attribute 'SSL_ST_INIT'

и ни один из других ответов не мог это исправить, потому что pip не смог ничего установить. Вместо этого я сначала сделал это из терминала:

sudo rm -r /usr/local/lib/python3.5/dist-packages/OpenSSL

Затем переустановил pyopenssl с pip:

sudo pip install pyopenssl

и все было подливкой.

Ответ 5

Недавно я столкнулся с той же проблемой и после нескольких часов расследования выяснил, что это вызвано обновлением криптографии 2.0. Это обновление будет разбивать многие пакеты с помощью pyopenssl (например, Sentry, Google Analytics и т.д.). Просто понизите его до 1.9, решите проблему.

Будьте осторожны, если вы используете "pip install -U", он автоматически обновит пакеты, которые не указаны в файле требований .txt.

Ответ 6

Попробуйте выполнить следующие команды:

easy_install -U pip
easy_install -U pyOpenSSL

Ответ 7

В моем случае проблема заключалась в том, что пакет был установлен в корневых каталогах, и я выполнял скрипт, который запрашивал pyopenssl с моим пользователем Linux forvas. И этот пользователь не может использовать библиотеки, установленные в корне.

Итак, сначала я должен был удалить пакет с помощью aptitude или apt-get.

sudo aptitude purge python-openssl

Поэтому мне пришлось снова установить пакет, но с учетом пользователя, который выполняет скрипт, который запрашивает библиотеку. Посмотрите, где установлена библиотека, в зависимости от пользователя Linux и аргумента --user pip.

Случай 1

[email protected]:$ pip install pyopenssl

Не удалось установить пакеты из-за ошибки EnvironmentError:

[Errno 13] В доступе отказано: '/usr/local/lib/python2.7/dist-packages/OpenSSL'

Подумайте об использовании опции --user или проверьте разрешения.

Дело 2

[email protected]:$ sudo pip install pyopenssl

/usr/local/lib/python2.7/dist-packages/OpenSSL/*

/usr/local/lib/python2.7/dist-packages/pyOpenSSL-17.5.0.dist-info/*

Дело 3

[email protected]:$ sudo pip install --user pyopenssl

/home/forvas/.local/lib/python2.7/site-packages/OpenSSL/*

/home/forvas/.local/lib/python2.7/site-packages/pyOpenSSL-17.5.0.dist-info/*

Дело 4

[email protected]:$ pip install pyopenssl

/usr/local/lib/python2.7/dist-packages/OpenSSL/*

/usr/local/lib/python2.7/dist-packages/pyOpenSSL-17.5.0.dist-info/*

Дело 5

[email protected]:$ pip install --user pyopenssl

/root/.local/lib/python2.7/site-packages/OpenSSL/*

/root/.local/lib/python2.7/site-packages/pyOpenSSL-17.5.0.dist-info/*

Заключение

Моя проблема заключалась в том, что библиотека была установлена в каталоги по делу 5.

Решение

  • Деинсталляция пакета.

  • Поскольку я выполняю сценарий с пользователем Linux forvas, мне удалось правильно переустановить пакет с параметрами 2 или 4 (в которых библиотека доступна для всех пользователей Linux) или, точнее, с параметром 3 (в котором библиотека доступно только для пользователя Linux forvas).

Ответ 8

У меня была та же проблема, и, так как пип больше не работал, мне пришлось выполнять его работу вручную:

wget https://files.pythonhosted.org/packages/40/d0/8efd61531f338a89b4efa48fcf1972d870d2b67a7aea9dcf70783c8464dc/pyOpenSSL-19.0.0.tar.gz
tar -xzvf pyOpenSSL-19.0.0.tar.gz
cd pyOpenSSL-19.0.0
sudo python setup.py install

После этого все заработало как положено.

Ответ 9

Моя проблема была вызвана версией Python openssl, которая была в /usr/lib/python2.7/dist-packages/.

dpkg -l | grep openssl dpkg -l | grep openssl показал:

ii  python-openssl                                0.15.1-2build1                               all          Python 2 wrapper around the OpenSSL library

Я удалил его с помощью sudo apt-get remove python-openssl. Затем я запустил следующее, чтобы установить дистрибутивную версию pip.

curl -o ./get-pip.py https://bootstrap.pypa.io/get-pip.py
sudo python2 ./get-pip.py

pip --version теперь отображает:

pip 18.0 from /usr/local/lib/python2.7/dist-packages/pip (python 2.7)

Затем я смог выполнить необходимую установку pip, которую пытался завершить.

Ответ 10

У меня была эта проблема на MacOS с python 2 и 3, установленным через brew. Оказывается, что brew uninstall, использующий python и python @2, не удаляет библиотеки, которые были установлены для этих версий python; то есть в:

/usr/local/lib/python3.7/site-packages/ и
/usr/local/lib/python2.7/site-packages/

Что-то там было не так, поэтому для меня сработало удалить/переместить все установленные библиотеки для brew python 2 и 3 и запустить снова (и с этого момента использовать только virtualenvs):

brew uninstall --ignore-dependencies [email protected]
brew uninstall --ignore-dependencies python
sudo mv /usr/local/lib/python3.7 ~/python3.7libs-backup
sudo mv /usr/local/lib/python2.7 ~/python2.7libs-backup
brew install python
brew install [email protected]

Ответ 11

У меня была такая же проблема на Ubuntu 16.04, но со следующим поворотом: когда был активирован virtualenv (. venv/bin/activate activ, прежде чем запускать рабочих из сельдерея с pysolr, запросами и т.д. В моем случае) - все работало отлично, но когда я запускал celery из командной строки с использованием полных путей и путей к Python - возникла проблема (и та же проблема при запуске из supervisord). Также, если это важно, virtualenv был добавлен в другом месте на машине с той же версией Ubuntu.

Решение было простым: добавление /full/path/to/venv/bin в PATH (как /full/path/to/venv/bin здесь https://serverfault.com/questions/331027/supervisord-how-to-append-to-path) решило эту проблему.

К сожалению, я еще не указал, какое обновление вызвало это, но, надеюсь, это может кому-то помочь.

Ответ 12

Я видел AttributeError: 'module' object has no attribute 'SSL_ST_INIT' ошибки AttributeError: 'module' object has no attribute 'SSL_ST_INIT'.

дела

sudo pip install pyOpenSSL==16.2.0

решил это для меня.

Ответ 13

Я видел похожий дамп стека Python на консоли моей виртуальной машины Ubuntu 16.04, когда я пробовал ssh в виртуальную машину.

SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

pip сообщил, что pyopenssl не был установлен.

Я должен был сделать это вместо этого:

sudo apt install --reinstall python-openssl

Ответ 14

В моем случае это выкидывало ту же ошибку при удалении и обновлении. Я не мог удалить или обновить.

AttributeError: 'module' object has no attribute 'SSL_ST_INIT'

Следующее сработало для меня.

# rm -rf /usr/lib/python2.7/site-packages/OpenSSL/
# rm -rf /usr/lib/python2.7/site-packages/pyOpenSSL-16.1.0.dist-info
# rm -rf /usr/lib/python2.7/site-packages/pyOpenSSL-18.0.0-py2.7.egg
# pip2.7 install pyopenssl
Collecting pyopenssl
Downloading 
.
.
100% |████████████████████████████████| 61kB 5.8MB/s 
Collecting cryptography>=2.2.1 (from pyopenssl)
.
.
Installing collected packages: cryptography, pyopenssl
Found existing installation: cryptography 1.7.2
Uninstalling cryptography-1.7.2:
  Successfully uninstalled cryptography-1.7.2
Successfully installed cryptography-2.2.2 pyopenssl-18.0.0

ВНИМАНИЕ: Попробуйте это, только если обновление (sudo pip install pyOpenSSL==16.2.0) или удаление (pip uninstall pyopenssl) не помогает

Ответ 15

На тот случай, если кто-то еще не найдет правильных заклинаний для этой работы, по состоянию на ноябрь 2018 года у меня сработало следующее:

sudo rm -rf/usr/local/lib/python2.7/dist-packages/OpenSSL/sudo apt install --reinstall python-openssl

Удачи!

Ответ 16

Я только что столкнулся с этим на моем хосте Ubuntu 16.04. Похоже, существует конфликт версий между пакетами репозитория apt для python-openssl и python-crypotgraphy, по сравнению с тем, что кто-то установил вручную с помощью pip в /usr/local/python2.7/dist-packages.

Как только он попал в это состояние, системный стандартный пипс тоже не смог выполнить. Я справился с проблемой курицы и яйца, вручную установив переменную окружения PYTHONPATH, которая исключила /usr/local часть дерева таким образом:

    $ export PYTHONPATH="/usr/lib/python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/gtk-2.0"
    $ /usr/bin/pip uninstall cryptography
    $ unset PYTHONPATH

Я получил приведенный выше список каталогов библиотеки для использования с оболочкой python:

    import sys
    for p in sys.path:
       print(p)

а затем скопировать все перечисленное, кроме одного каталога /usr/local. Ваша система может иметь другой список в своем пути. Отрегулируйте соответственно.

У меня также было несколько ручных команд apt-get install --reinstall python-openssl python-cryptography разбросанных по моей истории bash, которые могут быть или не быть необходимыми.

Ответ 17

Попробуйте с помощью:

export PYTHONPATH="/usr/lib/python2.7:/usr/lib/python2.7/plat-x86_64-linux-gnu:/usr/lib/python2.7/lib-tk:/usr/lib/python2.7/lib-old:/usr/lib/python2.7/lib-dynload:/usr/lib/python2.7/dist-packages:/usr/lib/python2.7/dist-packages/gtk-2.0"
sudo apt-get install --reinstall python-openssl

Ответ 18

Мое решение было намного более простым после того, как эти другие решения не помогли мне. Все, что я пытался установить/удалить через pip, возвращало ту же ошибку и трассировку стека.

В итоге я попытался обновить pip через pip3, и это сработало безупречно:

pip3 install --upgrade pip

Я вернулся к использованию pip, и все заработало правильно. Я заметил, что при запуске команд pip он ссылался на Python 3.6.

# pip install pyopenssl'enter code here'
Requirement already satisfied: pyopenssl in /usr/lib64/python3.6/site-packages (18.0.0)

<snipped>

Requirement already satisfied: pycparser in /usr/lib64/python3.6/site-packages (from cffi!=1.11.3,>=1.7->cryptography>=2.2.1->pyopenssl) (2.19)

Ответ 19

Это сработало для меня:

sudo apt remove python-openssl