Помилка атрибута Python: об'єкт 'module' не має атрибута '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'

Я python-opensslпрацюю в цій проблемі з debian-jessie, оновлений пакет (16.0.0-1 ~ bpo8 + 1) з jessie-backports теж не працює, тому мені доведеться оновити його за допомогою pip згідно з наведеними нижче рішеннями (використовувана версія була 18.0 .0)
iuridiniz

Відповіді:


160

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

sudo python -m easy_install --upgrade pyOpenSSL

кредит @delimiter ( відповідь )


2
Дякую! Після цієї команди мені довелося перезапустити термінал / вхід на сервер і після цього я pipпрацював нормально.
Джарвіс Джонсон,

познайомитися з новою помилкою-помилкою: сценарій встановлення завершено з помилкою: команда 'gcc' не вдалася зі статусом виходу 1
brainLoop

Це, мабуть, корисно, але навіть вийшовши з системи та знову ввійшовши, я все ще отримую AttributeErrorв ОП.
Адріан Кейстер

80

Виявилося, проблема в моїй установці pyOpenSSL, pyOpenSSL-0.15.1.

Я зробила:

pip uninstall pyopenssl

і потім

pip install pyopenssl

... і мій сценарій Python знову запрацював!


35
у мене були проблеми із запуском pip, це вирішилоsudo easy_install pyOpenSSL
chinmay

2
Щойно оновив криптографію; вашого рішення було достатньо в моєму випадку
Денвар,

3
У моєму випадку мені довелося видалити так: sudo aptitude purge python-opensslоскільки він був встановлений за допомогою aptitude. Думаю, я міг би зробити те саме зapt-get
ChesuCR

2
Я отримував помилку щоразу, коли бігав pip. Так зробив rm -rf cryptographyі міг запустити pip знову.
Джон Строуд

1
Ця проблема заважала мені успішно запускати pip. Отже, мені довелося видалити криптографію з lib / python2.7 / site-пакети, перш ніж слідувати інструкціям Бена.
Milad M

17

Оновіть свій pyopensslмодуль:

$ sudo pip install -U pyopenssl

1
Дякую, я вважаю, що це ефективніше, ніж видалення та встановлення знову.
Ben Wheeler

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

9

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

Будьте обережні, якщо ви використовуєте "pip install -U", він автоматично оновить пакети, які не вказані в requirements.txt.


Дякую, це спрацювало. Оновлення піопенсл мені було недостатньо.
r11

5

У моєму випадку, проблема в тому , що пакет був встановлений в кореневих каталогах, і я виконував сценарій , який просив pyopensslмоїх користувачів Linux forvas . І цей користувач не може використовувати бібліотеки, встановлені в root.

Тому спочатку мені довелося видалити пакет за допомогою 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 ).


Як це виглядатиме для Python 3?
Адріан Кейстер

За цим прикладом, наприклад, буде випадок 3 sudo python3 -m pip install --user pyopenssl, і пакети будуть зберігатися в /home/forvas/.local/lib/python3.6/site-packages.
полотно

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)

Тоді я зміг виконати необхідну піп-інсталяцію, яку намагався завершити.


1
Дякую @heatfanjohn. Я потрапив у точно таку ж ситуацію, як і ваша, і це працює, як ви писали!
icasimpan


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

Удачі!


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/

Щось там було не так, тому мені вдалося видалити / перемістити всі встановлені бібліотеки для пивоварів 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) не допомагає


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 repo для 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, і все працювало правильно. Я помітив, що він посилався на Python 3.6 під час запуску команд pip.

# 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

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 проти 3. Я використовую виключно Python 3; більше немає застарілого Python. Але в моїй ОС (наприклад, Ubuntu 16.04) все ще встановлений Python 2.7. Таким чином, коли pipза замовчуванням запускався глобальний (наприклад, не у virtualenv), я закликав версію Python 2 pip.

Для мене я використав наступне, щоб вирішити цю проблему.

Видалити 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 лише нещодавно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.