Python AttributeError: obiekt „moduł” nie ma atrybutu „SSL_ST_INIT”

80

Mój skrypt w Pythonie zawodzi:

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'
Ben Wheeler
źródło
python-opensslUruchamiam w tym problemie z debian-jessie, zaktualizowany pakiet (16.0.0-1 ~ bpo8 + 1) z jessie-backports też nie działa, więc muszę go zaktualizować za pomocą pip zgodnie z poniższymi rozwiązaniami (używana wersja to 18.0 .0)
iuridiniz

Odpowiedzi:

160

Aktualizacja za pyopensslpomocą pip nie działała, ponieważ żadne z poleceń związanych z programem nie działało pip. Poprzez aktualizację za pyopensslpomocą easy_installpowyższego problemu można rozwiązać.

sudo python -m easy_install --upgrade pyOpenSSL

Credit @delimiter ( odpowiedź )

Muhammad Hassan
źródło
2
Dzięki! Po tym poleceniu musiałem zrestartować terminal / zalogować się z powrotem do mojego serwera i po tym działałem pipdobrze.
Jarvis Johnson
napotkaj nowy błąd -error: Skrypt instalacyjny zakończył działanie z błędem: polecenie „gcc” nie powiodło się ze statusem wyjścia 1
brainLoop
Jest to prawdopodobnie pomocne, ale nawet wylogowuję się i ponownie loguję, nadal otrzymuję AttributeErrorOP.
Adrian Keister
80

Okazało się, że problem dotyczył mojej instalacji pyOpenSSL, pyOpenSSL-0.15.1.

Zrobiłem:

pip uninstall pyopenssl

i wtedy

pip install pyopenssl

... i mój skrypt w Pythonie znów zadziałał!

Ben Wheeler
źródło
35
miałem problemy z uruchomieniem pipsię, to rozwiązało problemsudo easy_install pyOpenSSL
chinmay
2
Właśnie zaktualizowałem kryptografię; Twoje rozwiązanie było wystarczające w moim przypadku
denvar
3
W moim przypadku musiałem odinstalować w ten sposób: sudo aptitude purge python-opensslponieważ został zainstalowany z aptitude. Myślę, że mógłbym zrobić to samo zapt-get
ChesuCR
2
Otrzymałem błąd za każdym razem, gdy biegałem pip. Tak też zrobił rm -rf cryptographyi mógł ponownie uruchomić pip.
John Strood
1
Ten problem uniemożliwił mi pomyślne uruchomienie pip. Musiałem więc usunąć kryptografię z lib / python2.7 / site-packages, zanim wykonałem instrukcje Bena.
Milad M
17

Zaktualizuj swój pyopensslmoduł:

$ sudo pip install -U pyopenssl
user197292
źródło
1
Dzięki, myślę, że jest to bardziej wydajne niż odinstalowanie i ponowna instalacja.
Ben Wheeler,
1
jeśli używasz virtualenv, nie potrzebujesz sudo.
Chris,
17

Miałem podobny błąd:

    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'

i żadna z pozostałych odpowiedzi nie mogła tego naprawić, ponieważ pip nie mógł niczego zainstalować. Zamiast tego zrobiłem to najpierw z terminala:

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

Następnie ponownie zainstalowałem pyopenssl za pomocą pip:

sudo pip install pyopenssl

i wszystko było w sosie.

słowa do rozumu
źródło
1
Warto zauważyć: jeśli używasz virtualenv, prawdopodobnie musisz usunąć rm -r ~/.virtualenvs/YourEnv/local/lib/python3.6/site-packages/OpenSSL
warcholprzemo.
11

Spróbuj, używając następujących poleceń:

easy_install -U pip
easy_install -U pyOpenSSL
felix021
źródło
9

Niedawno doświadczyłem tego samego problemu i po kilku godzinach badania stwierdziłem, że jest to spowodowane aktualizacją nowej kryptografii 2.0 . Ta aktualizacja zepsuje wiele pakietów używających pyopenssl (takich jak Sentry, Google Analytics itp.). Wystarczy obniżyć go do 1,9, aby rozwiązać problem.

Zachowaj ostrożność, jeśli używasz "pip install -U", automatycznie zaktualizuje pakiety, które nie są wymienione w Requirements.txt.

Fei Xie
źródło
Dzięki, to zadziałało. Uaktualnienie pyopenssl nie było dla mnie wystarczające.
11
5

W moim przypadku problem polegał na tym, że pakiet został zainstalowany w katalogach root , a ja wykonywałem skrypt, o który prosił pyopensslmój użytkownik Linuksa forvas . A ten użytkownik nie może korzystać z bibliotek zainstalowanych na koncie root.

Więc najpierw musiałem usunąć pakiet za pomocą aptitudelub apt-get.

sudo aptitude purge python-openssl

Dlatego musiałem ponownie zainstalować pakiet, ale biorąc pod uwagę użytkownika, który wykonuje skrypt, który pyta o bibliotekę. Spójrz na którym zainstalowana jest biblioteka w zależności od użytkownikiem Linuksa i argument --usero pip.

Przypadek 1

forvas@server:$ pip install pyopenssl

Nie można zainstalować pakietów z powodu błędu środowiskowego:

[Errno 13] Odmowa dostępu: „/usr/local/lib/python2.7/dist-packages/OpenSSL”

Rozważ skorzystanie z tej --useropcji lub sprawdź uprawnienia.

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

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

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

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

Wniosek

Mój problem polegał na tym, że biblioteka została zainstalowana w katalogach sprawy 5 .

Rozwiązanie

  • Odinstalowanie pakietu.

  • Ponieważ wykonuję skrypt z użytkownikiem Linuksa forvas , udało mi się poprawnie ponownie zainstalować pakiet z opcjami 2 lub 4 (w których biblioteka jest dostępna dla wszystkich użytkowników Linuksa) lub dokładniej, opcja 3 (w której biblioteka jest dostępne tylko dla użytkowników Linuksa forvas ).

forvas
źródło
Jak wyglądałoby to w przypadku Pythona 3?
Adrian Keister
Zgodnie z tym przykładem, na przykład przypadek 3 byłby sudo python3 -m pip install --user pyopenssl, a pakiety byłyby przechowywane w plikach /home/forvas/.local/lib/python3.6/site-packages.
poprzednio
4

Miałem ten sam problem i ponieważ pip już nie działał, musiałem wykonać swoją pracę ręcznie:

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

Potem wszystko działało zgodnie z oczekiwaniami.

Delaballe
źródło
3

Mój problem był spowodowany wersją Pythona openssl, która była w /usr/lib/python2.7/dist-packages/.

dpkg -l | grep openssl pokazał:

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

Usunąłem go za pomocą sudo apt-get remove python-openssl. Następnie uruchomiłem poniższe, aby zainstalować wersję dystrybucyjną pip.

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

pip --version teraz wyświetla:

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

Byłem wtedy w stanie wykonać niezbędną instalację pip, którą próbowałem ukończyć.

HeatfanJohn
źródło
1
Dzięki @heatfanjohn. Byłem w dokładnie takiej samej sytuacji jak Twoja i działa tak, jak napisałeś!
icasimpan
3

To zadziałało dla mnie:

sudo apt remove python-openssl
luilver
źródło
2

Widziałem też AttributeError: 'module' object has no attribute 'SSL_ST_INIT'błąd.

Robić

sudo pip install pyOpenSSL==16.2.0

rozwiązałem to za mnie.

Vikram Hosakote
źródło
2

Na wypadek, gdyby ktoś inny nie znalazł dokładnie odpowiednich zaklęć, aby to zadziałało, od listopada 2018 r. Działało dla mnie:

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

Powodzenia!

brianpgerson
źródło
2

Miałem ten problem na MacOS z pythonem 2 i 3 zainstalowanym przez brew. Okazuje się, że brew uninstalling python i python @ 2 nie usuwa żadnych bibliotek, które zostały zainstalowane dla tych wersji pythona; czyli w:

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

Coś tam było nie tak, więc to, co zadziałało, to usunięcie / przeniesienie wszystkich zainstalowanych bibliotek dla Pythona 2 i 3 brew i rozpoczęcie od nowa (i upewniam się, że od tej pory używam tylko 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
Fiskabollen
źródło
1

W moim przypadku wyrzucał ten sam błąd przy odinstalowywaniu i uaktualnianiu. Nie mogłem odinstalować ani zaktualizować.

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

Następujące pracowały dla mnie.

# 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

OSTRZEŻENIE : Spróbuj tego tylko wtedy, gdy aktualizacja ( sudo pip install pyOpenSSL==16.2.0) lub odinstalowanie ( pip uninstall pyopenssl) nie pomaga

f-społeczeństwo
źródło
1

Miałem ten sam problem na Ubuntu 16.04, ale z następującym zwrotem akcji: kiedy virtualenv został aktywowany ( . venv/bin/activateprzed uruchomieniem robotników selera z pysolrem, żądaniami itp. W moim przypadku) - wszystko działało idealnie, ale kiedy uruchomiłem selera z linii poleceń używając pełnych ścieżek i ścieżki Pythona - wystąpił problem (i ten sam problem podczas uruchamiania z programu supervisord). Ponadto, jeśli jest to ważne, virtualenv został dołączony w innym miejscu na maszynie z tą samą wersją Ubuntu.

Rozwiązanie było proste: dodanie /full/path/to/venv/bindo PATH (zgodnie z zaleceniami tutaj /server/331027/supervisord-how-to-append-to-path ) rozwiązało ten problem.

Niestety nie wskazałem jeszcze, jakiego rodzaju aktualizacja to spowodowała, ale mam nadzieję, że może to komuś pomóc.

Roman Susi
źródło
1

Właśnie spotkałem się z tym na moim hoście Ubuntu 16.04. Wygląda na to, że istnieje konflikt wersji między pakietami apt repo dla python-openssl i python-crypotgraphy, a tym, co ktoś zainstalował ręcznie za pomocą pip do /usr/local/python2.7/dist-packages.

Gdy wszedł w ten stan, standardowy pip systemowy również nie mógł wykonać. Poradziłem sobie z problemem jajka i jajka, ręcznie ustawiając zmienną środowiskową PYTHONPATH, która wyklucza / usr / lokalną część drzewa w ten sposób:

    $ 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

Otrzymałem powyższą listę katalogów bibliotecznych do użycia z powłoką Pythona:

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

a następnie skopiowanie wszystkiego, co wymienione z wyjątkiem jednego katalogu / usr / local. Twój system może mieć inną listę na swojej ścieżce. Odpowiednio wyreguluj.

Miałem też kilka ręcznych apt-get install --reinstall python-openssl python-cryptographypoleceń rozproszonych w mojej historii basha, co mogło być konieczne lub nie.

Joi Owen
źródło
1

Moje rozwiązanie było znacznie bardziej uproszczone po tym, jak te inne rozwiązania nie działały dla mnie. Wszystko, co próbowałem zainstalować / odinstalować przez pip, zwróciło ten sam błąd i śledzenie stosu.

Skończyło się na tym, że próbowałem zaktualizować pip przez pip3 i działało bezbłędnie:

pip3 install --upgrade pip

Wróciłem do używania pip i wszystko działało poprawnie. Zauważyłem jednak, że odwoływał się do Pythona 3.6 podczas uruchamiania poleceń 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)
LesterCovax
źródło
1

Spróbuj z:

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
źródło
1

Widziałem podobny zrzut stosu Pythona na konsoli mojej maszyny wirtualnej Ubuntu 16.04, kiedy próbowałem ssh na maszynie wirtualnej.

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

pipzgłosił, że pyopensslnie został zainstalowany.

Zamiast tego musiałem to zrobić:

sudo apt install --reinstall python-openssl
Deepak Mohanty
źródło
0

To jest starszy post, więc odpowiadam, mam nadzieję, że pomogę komuś pod koniec 2019 roku ... mój problem dotyczył Pythona 2 vs 3. Używam wyłącznie Pythona 3; koniec ze starszym Pythonem. Ale mój system operacyjny (np. Ubuntu 16.04) nadal ma zainstalowany Python 2.7. Tak więc, gdy pipdomyślnie działam globalnie (np. Nie w virtualenv), wywoływałem wersję Pythona 2 programu pip.

Dla mnie użyłem następujących, aby rozwiązać ten problem.

Odinstaluj docker-compose:

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

Zainstaluj ponownie docker-composedla mojej wersji Pythona:

sudo pip3 install docker-compose
nicorellius
źródło
0

Używam systemu OSX 10.15.5 Catalina i używam pyenv.

Po wypróbowaniu wielu innych rozwiązań na tej stronie, co zadziałało, to:

pyenv uninstall 3.6.8
pyenv install 3.6.8

Muszę przyznać, że nie jestem pewien, dlaczego to rozwiązało ten problem, ponieważ dopiero niedawno zainstalowałem tę wersję Pythona.

Derek Hill
źródło