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

80

Мой сценарий Python не работает с:

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'
Бен Уиллер
источник
Я столкнулся с этой проблемой с помощью debian-jessie, обновленный пакет python-openssl(16.0.0-1 ~ bpo8 + 1) из jessie-backports тоже не работает, поэтому мне нужно обновить его с помощью pip в соответствии с приведенными ниже решениями (использованная версия была 18.0 .0)
iuridiniz 02

Ответы:

160

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

sudo python -m easy_install --upgrade pyOpenSSL

кредит @delimiter ( Ответ )

Мухаммад Хасан
источник
2
Благодаря! Мне пришлось перезапустить мой терминал / снова войти на мой сервер после этой команды, и pipпосле этого я работал нормально.
Джарвис Джонсон
встречайте новую ошибку -error: сценарий установки завершился с ошибкой: команда 'gcc'
завершилась
Это, вероятно, полезно, но даже при выходе из системы и повторном входе я все еще получаю сообщение AttributeErrorв OP.
Адриан Кейстер
80

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

Я сделал:

pip uninstall pyopenssl

а потом

pip install pyopenssl

... и мой скрипт Python снова заработал!

Бен Уиллер
источник
35
у меня были проблемы с запуском pip, это решило ихsudo easy_install pyOpenSSL
chinmay
2
Только что обновил криптографию; в моем случае ваше решение было достаточным
denvar
3
В моем случае мне пришлось удалить так: sudo aptitude purge python-opensslпотому что он был установлен с aptitude. Думаю, я мог бы сделать то же самое сapt-get
ChesuCR
2
Я получал ошибку каждый раз при запуске pip. Так сделал rm -rf cryptographyи снова смог запустить pip.
Джон Строуд
1
Эта проблема помешала мне успешно запустить pip. Итак, мне пришлось удалить криптографию из lib / python2.7 / site-packages, прежде чем следовать инструкциям Бена.
Milad M
17

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

$ sudo pip install -U pyopenssl
user197292
источник
1
Спасибо, я считаю, что это более эффективно, чем удаление и повторная установка.
Бен Уиллер,
1
если вы используете virtualenv, вам не нужно sudo.
Крис
17

У меня была аналогичная ошибка:

    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

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

слова
источник
1
Стоит отметить: если вы используете virtualenv, то, вероятно, вам нужно удалить rm -r ~/.virtualenvs/YourEnv/local/lib/python3.6/site-packages/OpenSSL
warcholprzemo
11

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

easy_install -U pip
easy_install -U pyOpenSSL
felix021
источник
9

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

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

Фэй Се
источник
Спасибо, это сработало. Мне было недостаточно обновления pyopenssl.
r11
5

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

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

sudo aptitude purge python-openssl

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

Случай 1

forvas@server:$ pip install pyopenssl

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

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

Рассмотрите возможность использования этой --userопции или проверьте разрешения.

Случай 2

forvas@server:$ 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

forvas@server:$ 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

root@server:$ 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

root@server:$ 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 ).

Forvas
источник
Как это будет выглядеть для Python 3?
Адриан Кейстер
Следуя этому примеру, например, случай 3 будет sudo python3 -m pip install --user pyopenssl, и пакеты будут храниться в /home/forvas/.local/lib/python3.6/site-packages.
Forvas
4

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

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

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

Делабаль
источник
3

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

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, которую пытался завершить.

HeatfanДжон
источник
1
Спасибо @heatfanjohn. Я был в той же ситуации, что и ваша, и все работает так, как вы написали!
icasimpan
3

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

sudo apt remove python-openssl
Люильвер
источник
2

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

Делать

sudo pip install pyOpenSSL==16.2.0

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

Викрам Хосакоте
источник
2

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

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

Удачи!

Brianpgerson
источник
2

У меня была эта проблема на MacOS с python 2 и 3, установленными через brew. Оказывается, что brew uninstalling 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 python@2
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 python@2
Фискаболлен
источник
1

В моем случае при удалении и обновлении возникала та же ошибка. Не удалось удалить или обновить.

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) не помогает

f-общество
источник
1

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

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

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

Роман Суси
источник
1

Я только что столкнулся с этим на моем хосте 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, которые могли или не могли быть необходимыми.

Джой Оуэн
источник
1

Мое решение было намного проще после того, как эти другие решения не работали для меня. Все, что я пытался установить / удалить через 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)
ЛестерКовакс
источник
1

Попробуйте:

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
YoungJeXu
источник
1

Я видел аналогичный дамп стека 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
Дипак Моханти
источник
0

Это более старый пост, поэтому я отвечаю, надеюсь, кому-нибудь помочь в конце 2019 года ... моя проблема была связана с Python 2 vs 3. Я использую исключительно Python 3; больше нет устаревшего Python. Но в моей ОС (например, Ubuntu 16.04) по-прежнему установлен Python 2.7. Таким образом, при запуске global pipпо умолчанию (например, не в virtualenv) я вызывал версию Python 2pip .

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

Удалить docker-compose:

sudo pip3 uninstall docker-compose  
sudo pip uninstall docker-compose

Переустановите docker-composeмою версию Python:

sudo pip3 install docker-compose
Никореллий
источник
0

Я запускаю OSX 10.15.5 Catalina и использую pyenv.

Попробовав ряд других решений на этой странице, у меня сработало:

pyenv uninstall 3.6.8
pyenv install 3.6.8

Должен признать, я не уверен, почему это решило эту проблему, потому что я установил эту версию Python совсем недавно.

Дерек Хилл
источник