Python AttributeError: el objeto 'módulo' no tiene atributo 'SSL_ST_INIT'


80

Un script de Python mío está fallando con:

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-opensslEjecuto este problema con debian-jessie, el paquete actualizado (16.0.0-1 ~ bpo8 + 1) de jessie-backports tampoco funciona, así que tengo que actualizarlo usando pip de acuerdo con las soluciones a continuación (la versión utilizada era 18.0 .0)
iuridiniz

Respuestas:


160

Actualizar pyopensslcon pip no funcionaba ya que ninguno de los comandos relacionados con pipfuncionaba para mí. Actualizando pyopensslcon easy_install, el problema anterior se puede resolver.

sudo python -m easy_install --upgrade pyOpenSSL

credit @delimiter ( Respuesta )


2
¡Gracias! Tuve que reiniciar mi terminal / volver a iniciar sesión en mi servidor después de este comando, y pipfuncionó bien después de eso.
Jarvis Johnson

cumplir con el nuevo error -error: el script de configuración salió con el error: el comando 'gcc' falló con el estado de salida 1
brainLoop

Esto es útil, probablemente, pero incluso al cerrar la sesión y volver a iniciarla, todavía obtengo AttributeErrorel OP.
Adrian Keister

80

Resultó que el problema estaba en mi instalación de pyOpenSSL, pyOpenSSL-0.15.1.

Yo hice:

pip uninstall pyopenssl

y entonces

pip install pyopenssl

... ¡y mi script de Python funcionó de nuevo!


35
Tuve problemas para funcionar pipsolo, esto lo resolviósudo easy_install pyOpenSSL
chinmay

2
Acababa de actualizar la criptografía; su solución fue suficiente en mi caso
denvar

3
En mi caso, tuve que desinstalarlo así: sudo aptitude purge python-opensslporque se instaló con aptitude. Creo que podría hacer lo mismo conapt-get
ChesuCR

2
Recibí el error cada vez que corría pip. También lo hizo rm -rf cryptographyy podría volver a ejecutar pip.
John Strood

1
Este problema me impidió ejecutar con éxito pip. Entonces, tuve que eliminar la criptografía de lib / python2.7 / site-packages antes de seguir las instrucciones de Ben.
Milad M

17

Actualice su pyopensslmódulo:

$ sudo pip install -U pyopenssl

1
Gracias, creo que es más eficiente que desinstalar e instalar de nuevo.
Ben Wheeler

1
si usa un virtualenv no necesita sudo.
Chris

17

Tuve un error similar:

    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'

y ninguna de las otras respuestas pudo solucionarlo, porque pip no pudo instalar nada. En cambio, lo que hice fue esto desde la terminal primero:

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

Luego reinstaló pyopenssl con pip:

sudo pip install pyopenssl

y todo fue salsa.


1
Vale la pena señalar: si usa virtualenv, entonces probablemente necesite eliminar rm -r ~/.virtualenvs/YourEnv/local/lib/python3.6/site-packages/OpenSSL
warcholprzemo

11

Prueba con los siguientes comandos:

easy_install -U pip
easy_install -U pyOpenSSL

9

Experimenté el mismo problema recientemente y después de algunas horas de investigación, descubrí que fue causado por New cryptography 2.0 actualización de la . Esta actualización romperá muchos paquetes usando pyopenssl (como Sentry, Google Analytics, etc.). Simplemente degradarlo a 1.9 resolverá el problema.

Tenga cuidado si está usando "pip install -U", actualizará automáticamente los paquetes que no están listados en requirements.txt.


Gracias, esto funcionó. Actualizar pyopenssl no fue suficiente para mí.
r11

5

En mi caso, el problema era que el paquete estaba instalado en los directorios raíz y estaba ejecutando el script que pedía pyopensslcon mi usuario de Linux forvas . Y ese usuario no puede usar las bibliotecas instaladas en root.

Así que primero tuve que eliminar el paquete con aptitudeo apt-get.

sudo aptitude purge python-openssl

Por lo tanto, tuve que volver a instalar el paquete, pero teniendo en cuenta el usuario que está ejecutando el script que solicita la biblioteca. Eche un vistazo a dónde está instalada la biblioteca según el usuario de Linux y el argumento --userde pip.

Caso 1

forvas@server:$ pip install pyopenssl

No se pudieron instalar los paquetes debido a un EnvironmentError:

[Errno 13] Permiso denegado: '/usr/local/lib/python2.7/dist-packages/OpenSSL'

Considere usar la --useropción o verifique los permisos.

Caso 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/*

Caso 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/*

Caso 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/*

Caso 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/*

Conclusión

Mi problema fue que la librería estaba instalada en los directorios del caso 5 .

Solución

  • Desinstalar el paquete.

  • Mientras ejecuto el script con las formas de usuario de Linux , pude reinstalar el paquete correctamente con las opciones 2 o 4 (en las que la biblioteca está disponible para todos los usuarios de Linux) o más precisa, la opción 3 (en la que se solo disponible para usuarios de Linux forvas ).


¿Cómo se vería esto para Python 3?
Adrian Keister

Siguiendo este ejemplo, el caso 3, por ejemplo, sería sudo python3 -m pip install --user pyopenssl, y los paquetes se almacenarían en /home/forvas/.local/lib/python3.6/site-packages.
forvas

4

Tuve el mismo problema y como pip ya no funcionaba, tuve que hacer su trabajo manualmente:

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

Después de eso, todo funcionó como se esperaba.


3

Mi problema fue causado por la versión de Python openssl que estaba en /usr/lib/python2.7/dist-packages/.

dpkg -l | grep openssl mostró:

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

Lo eliminé usando sudo apt-get remove python-openssl. Luego ejecuté lo siguiente para instalar la versión de distribución de pip.

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

pip --version ahora muestra:

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

Luego pude realizar la instalación de pip necesaria que estaba tratando de completar.


1
Gracias @heatfanjohn. ¡Estaba exactamente en la misma situación que la tuya y funciona como has escrito!
icasimpan

3

Esto funcionó para mí:

sudo apt remove python-openssl

2

Yo también vi el AttributeError: 'module' object has no attribute 'SSL_ST_INIT'error.

Haciendo

sudo pip install pyOpenSSL==16.2.0

lo resolvió por mí.


2

En caso de que alguien más no encuentre exactamente los encantamientos correctos para que esto funcione, a partir de noviembre de 2018, lo que funcionó para mí fue:

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

¡Buena suerte!


2

Tuve este problema en MacOS con python 2 y 3 instalados a través de brew. Resulta que brew uninstalling python y python @ 2 no eliminan las bibliotecas que se instalaron para esas versiones de python; es decir, en:

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

Algo allí no estaba bien, así que lo que funcionó para mí fue eliminar / mover todas las bibliotecas instaladas para brew's python 2 y 3 y comenzar de nuevo (y asegúrese de usar virtualenvs de aquí en adelante):

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

En mi caso, arrojaba el mismo error para desinstalar y actualizar. No pude desinstalar ni actualizar.

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

Seguir funcionó para mí.

# 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

ADVERTENCIA : intente esto solo si actualizar ( sudo pip install pyOpenSSL==16.2.0) o desinstalar ( pip uninstall pyopenssl) no ayuda


1

Tuve el mismo problema en Ubuntu 16.04, pero con el siguiente giro: cuando se activó virtualenv ( . venv/bin/activateantes de ejecutar apio trabajadores con pysolr, solicitudes, etc. en mi caso), todo funcionó perfectamente, pero cuando ejecuté apio desde la línea de comando usando rutas completas y rutas de Python: había un problema (y el mismo problema se ejecutaba desde supervisord). Además, si es importante, virtualenv se ha incluido en otro lugar de la máquina con la misma versión de Ubuntu.

La solución fue simple: agregar /full/path/to/venv/bina PATH (como se recomienda aquí /server/331027/supervisord-how-to-append-to-path ) resolvió esto.

Desafortunadamente, todavía no he identificado qué tipo de actualización causó esto, pero espero que esto pueda ayudar a alguien.


1

Acabo de encontrar esto en mi host Ubuntu 16.04. Parece haber un conflicto de versiones entre los paquetes de repositorio de apt para python-openssl y python-crypotgraphy, frente a lo que alguien instaló manualmente con pip en /usr/local/python2.7/dist-packages.

Una vez que entró en este estado, el pip estándar del sistema tampoco se pudo ejecutar. Resolví el problema del huevo y la gallina configurando manualmente una variable de entorno PYTHONPATH que excluía la parte / usr / local del árbol de la siguiente manera:

    $ 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

Adquirí la lista anterior de directorios de bibliotecas para usar con el shell de Python:

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

y luego copiar todo lo que aparece en la lista excepto el directorio / usr / local. Su sistema puede tener una lista diferente en su ruta. Ajustar en consecuencia.

También tuve algunos apt-get install --reinstall python-openssl python-cryptographycomandos manuales dispersos en mi historial de bash, que pueden haber sido necesarios o no.


1

Mi solución fue mucho más simplista después de que estas otras soluciones no me funcionen. Todo lo que intenté instalar / desinstalar a través de pip devolvió el mismo error y stacktrace.

Terminé tratando de actualizar pip a través de pip3 y funcionó perfectamente:

pip3 install --upgrade pip

Volví a usar pip y todo funcionó correctamente. Sin embargo, noté que hacía referencia a Python 3.6 cuando ejecutaba los comandos 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

Prueba con:

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

Estaba viendo un volcado de pila de Python similar en la consola de mi máquina virtual Ubuntu 16.04 cuando probé ssh en la máquina virtual.

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

pipinformó que pyopensslno estaba instalado.

Tuve que hacer esto en su lugar:

sudo apt install --reinstall python-openssl

0

Esta es una publicación más antigua, así que estoy respondiendo para ayudar a alguien a fines de 2019 ... mi problema tenía que ver con Python 2 vs 3. Estoy usando Python 3 exclusivamente; no más Python heredado. Pero mi sistema operativo (por ejemplo, Ubuntu 16.04) todavía tiene Python 2.7 instalado. Por lo tanto, al ejecutar global pipde forma predeterminada (por ejemplo, no en un virtualenv), estaba llamando a la versión Python 2 de pip.

Para mí, utilicé lo siguiente para solucionar este problema.

Desinstalar docker-compose:

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

Reinstalar docker-composepara mi versión de Python:

sudo pip3 install docker-compose

0

Estoy ejecutando OSX 10.15.5 Catalina y usando pyenv.

Después de haber probado varias otras soluciones en esta página, lo que funcionó para mí es:

pyenv uninstall 3.6.8
pyenv install 3.6.8

Debo admitir que no estoy seguro de por qué esto resolvió este problema, porque recientemente instalé esta versión de Python.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.