Ответ 1
Оказалось, что проблема связана с моей установкой pyOpenSSL, pyOpenSSL-0.15.1.
Я сделал:
pip uninstall pyopenssl
а затем
pip install pyopenssl
... и мой Python script снова работает!
У меня не работает 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'
Оказалось, что проблема связана с моей установкой pyOpenSSL, pyOpenSSL-0.15.1.
Я сделал:
pip uninstall pyopenssl
а затем
pip install pyopenssl
... и мой Python script снова работает!
Обновление pyopenssl
с помощью pip не работало, поскольку ни одна из команд, связанных с pip
, не работала для меня. Обновив pyopenssl
с помощью easy_install
, проблема может быть решена.
sudo python -m easy_install --upgrade pyOpenSSL
credit @delimiter (Answer)
Обновите модуль pyopenssl
:
$ sudo pip install -U pyopenssl
У меня была похожая ошибка:
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
и все было подливкой.
Недавно я столкнулся с той же проблемой и после нескольких часов расследования выяснил, что это вызвано обновлением криптографии 2.0. Это обновление будет разбивать многие пакеты с помощью pyopenssl (например, Sentry, Google Analytics и т.д.). Просто понизите его до 1.9, решите проблему.
Будьте осторожны, если вы используете "pip install -U", он автоматически обновит пакеты, которые не указаны в файле требований .txt.
Попробуйте выполнить следующие команды:
easy_install -U pip
easy_install -U pyOpenSSL
В моем случае проблема заключалась в том, что пакет был установлен в корневых каталогах, и я выполнял скрипт, который запрашивал 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).
У меня была та же проблема, и, так как пип больше не работал, мне пришлось выполнять его работу вручную:
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
После этого все заработало как положено.
Моя проблема была вызвана версией 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, которую пытался завершить.
У меня была эта проблема на 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]
У меня была такая же проблема на 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) решило эту проблему.
К сожалению, я еще не указал, какое обновление вызвало это, но, надеюсь, это может кому-то помочь.
Я видел 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
решил это для меня.
Я видел похожий дамп стека 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
В моем случае это выкидывало ту же ошибку при удалении и обновлении. Я не мог удалить или обновить.
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
) не помогает
На тот случай, если кто-то еще не найдет правильных заклинаний для этой работы, по состоянию на ноябрь 2018 года у меня сработало следующее:
sudo rm -rf/usr/local/lib/python2.7/dist-packages/OpenSSL/sudo apt install --reinstall python-openssl
Удачи!
Я только что столкнулся с этим на моем хосте 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, которые могут быть или не быть необходимыми.
Попробуйте с помощью:
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
Мое решение было намного более простым после того, как эти другие решения не помогли мне. Все, что я пытался установить/удалить через 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)
Это сработало для меня:
sudo apt remove python-openssl