Python AttributeError: đối tượng 'module' không có thuộc tính 'SSL_ST_INIT'


80

Một tập lệnh Python của tôi không thành công với:

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'

Tôi gặp sự cố này với debian-jessie, gói nâng cấp python-openssl(16.0.0-1 ~ bpo8 + 1) từ jessie-backports cũng không hoạt động, vì vậy tôi phải nâng cấp nó bằng pip theo các giải pháp dưới đây (phiên bản đã sử dụng là 18.0 .0)
iuridiniz

Câu trả lời:


159

Nâng cấp pyopensslbằng pip không hoạt động vì không có lệnh nào liên quan đến hoạt pipđộng đối với tôi. Bằng cách nâng cấp pyopensslvới easy_install, vấn đề trên có thể được giải quyết.

sudo python -m easy_install --upgrade pyOpenSSL

credit @delimiter ( Trả lời )


2
Cảm ơn! Tôi đã phải khởi động lại thiết bị đầu cuối / đăng nhập lại vào máy chủ của mình sau lệnh này và piphoạt động tốt sau đó.
Jarvis Johnson

đáp ứng-lỗi lỗi mới: Thiết lập kịch bản đã thoát với lỗi: lệnh 'gcc' thất bại với trạng thái thoát 1
brainLoop

Điều này có thể hữu ích, nhưng ngay cả khi đăng xuất và đăng nhập lại, tôi vẫn nhận được AttributeErrortrong OP.
Adrian Keister

80

Hóa ra vấn đề là do tôi cài đặt pyOpenSSL, pyOpenSSL-0.15.1.

Tôi đã làm:

pip uninstall pyopenssl

và sau đó

pip install pyopenssl

... và tập lệnh Python của tôi đã hoạt động trở lại!


35
tôi gặp sự cố khi piptự vận hành , điều này đã giải quyết đượcsudo easy_install pyOpenSSL
chinmay

2
Vừa mới nâng cấp mật mã; giải pháp của bạn là đủ trong trường hợp của tôi
denvar

3
Trong trường hợp của tôi, tôi phải gỡ cài đặt như thế này: sudo aptitude purge python-opensslvì nó đã được cài đặt với aptitude. Tôi nghĩ tôi cũng có thể làm được điều tương tự vớiapt-get
ChesuCR

2
Tôi nhận lỗi mỗi khi tôi chạy pip. Như vậy đã làm rm -rf cryptographyvà có thể chạy lại pip.
John Strood,

1
Sự cố này đã ngăn tôi chạy pip thành công. Vì vậy, tôi phải xóa mật mã khỏi lib / python2.7 / site-package trước khi làm theo hướng dẫn của Ben.
Milad M

17

Cập nhật pyopensslmô-đun của bạn :

$ sudo pip install -U pyopenssl

1
Cảm ơn, tôi thấy điều đó hiệu quả hơn việc gỡ cài đặt và cài đặt lại.
Ben Wheeler

1
nếu bạn sử dụng virtualenv, bạn không cần sudo.
Chris

17

Tôi đã gặp một lỗi tương tự:

    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'

và không có câu trả lời nào khác có thể khắc phục được nó, vì pip không thể cài đặt bất cứ thứ gì. Thay vào đó, những gì tôi đã làm là điều này từ thiết bị đầu cuối đầu tiên:

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

Sau đó, cài đặt lại pyopenssl bằng pip:

sudo pip install pyopenssl

và mọi thứ đều là nước thịt.


1
Đáng chú ý: nếu bạn sử dụng virtualenv sau đó có lẽ bạn cần phải loại bỏ rm -r ~/.virtualenvs/YourEnv/local/lib/python3.6/site-packages/OpenSSL
warcholprzemo

11

Hãy thử với các lệnh sau:

easy_install -U pip
easy_install -U pyOpenSSL

9

Tôi đã gặp phải vấn đề tương tự gần đây và sau vài giờ điều tra, tôi phát hiện ra rằng nguyên nhân là do nâng cấp New cryptography 2.0 . Nâng cấp này sẽ phá vỡ nhiều gói sử dụng pyopenssl (như Sentry, Google Analytics, v.v.). Chỉ cần hạ cấp xuống 1.9 sẽ giải quyết được vấn đề.

Hãy thận trọng nếu bạn đang sử dụng "pip install -U", nó sẽ tự động nâng cấp các gói không được liệt kê trong tệp tests.txt.


Cảm ơn, điều này đã làm việc. Tôi không thể nâng cấp pyopenssl.
r11

5

Trong trường hợp của tôi, vấn đề là gói đã được cài đặt trong thư mục gốc và tôi đang thực thi tập lệnh được yêu cầu pyopensslvới người dùng Linux forvas của mình . Và người dùng đó không thể sử dụng các thư viện được cài đặt trong root.

Vì vậy, đầu tiên tôi phải xóa gói bằng aptitudehoặc apt-get.

sudo aptitude purge python-openssl

Do đó, tôi đã phải cài đặt lại gói, nhưng có tính đến người dùng đang thực thi tập lệnh đang yêu cầu thư viện. Hãy xem nơi thư viện được cài đặt tùy thuộc vào người dùng Linux và đối số --usercủa pip.

Trường hợp 1

forvas@server:$ pip install pyopenssl

Không thể cài đặt gói do lỗi Môi trường:

[Errno 13] Quyền bị từ chối: '/usr/local/lib/python2.7/dist-packages/OpenSSL'

Xem xét sử dụng --usertùy chọn hoặc kiểm tra các quyền.

Trường hợp 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/*

Trường hợp 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/*

Trường hợp 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/*

Trường hợp 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/*

Phần kết luận

Vấn đề của tôi là thư viện đã được cài đặt trong các thư mục của case 5 .

Giải pháp

  • Gỡ cài đặt gói.

  • Khi tôi đang thực thi tập lệnh với Linux người dùng forvas , tôi đã có thể cài đặt lại gói đúng với tùy chọn 2 hoặc 4 (trong đó thư viện có sẵn cho tất cả người dùng Linux) hoặc chính xác hơn, tùy chọn 3 (trong đó thư viện chỉ có sẵn cho người dùng Linux forvas ).


Điều này sẽ trông như thế nào đối với Python 3?
Adrian Keister

Theo ví dụ này, ví dụ trường hợp 3 sẽ là sudo python3 -m pip install --user pyopenssl, và các gói sẽ được lưu trữ trong /home/forvas/.local/lib/python3.6/site-packages.
forvas

4

Tôi gặp vấn đề tương tự và vì pip không hoạt động nữa nên tôi phải thực hiện công việc của mình theo cách thủ công:

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

Sau đó mọi thứ hoạt động như mong đợi.


3

Sự cố của tôi là do phiên bản openssl Python có trong đó /usr/lib/python2.7/dist-packages/.

dpkg -l | grep openssl đã cho thấy:

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

Tôi đã gỡ bỏ nó bằng cách sử dụng sudo apt-get remove python-openssl. Sau đó, tôi chạy phần sau để cài đặt phiên bản phân phối của pip.

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

pip --version bây giờ hiển thị:

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

Sau đó, tôi đã có thể thực hiện cài đặt pip cần thiết mà tôi đang cố gắng hoàn thành.


1
Cảm ơn @heatfanjohn. Tôi đã ở trong hoàn cảnh giống hệt như bạn và nó hoạt động như bạn đã viết!
icasimpan

3

Điều này đã làm việc cho tôi:

sudo apt remove python-openssl

2

Tôi cũng thấy AttributeError: 'module' object has no attribute 'SSL_ST_INIT'lỗi.

Đang làm

sudo pip install pyOpenSSL==16.2.0

giải quyết nó cho tôi.


2

Đề phòng trường hợp bất kỳ ai khác không tìm thấy chính xác câu thần chú phù hợp để làm cho tác phẩm này hoạt động, kể từ tháng 11 năm 2018, điều phù hợp với tôi là:

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

Chúc may mắn!


2

Tôi gặp sự cố này trên MacOS với python 2 và 3 được cài đặt qua brew. Hóa ra là brew uninstalling python và python @ 2 không xóa bất kỳ thư viện nào đã được cài đặt cho các phiên bản python đó; tức là trong:

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

Có điều gì đó không ổn ở đó, vì vậy điều làm việc với tôi là xóa / di chuyển tất cả các thư viện đã cài đặt cho python 2 và 3 của brew và bắt đầu lại (và đảm bảo chỉ sử dụng virtualenvs từ đây trở đi):

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

Trong trường hợp của tôi, Nó đã gặp lỗi tương tự khi gỡ cài đặt và nâng cấp. Tôi không thể gỡ cài đặt hoặc nâng cấp.

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

Sau đây làm việc cho tôi.

# 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

CẢNH BÁO : Chỉ thử cách này nếu nâng cấp ( sudo pip install pyOpenSSL==16.2.0) hoặc gỡ cài đặt ( pip uninstall pyopenssl) không hữu ích


1

Tôi đã gặp vấn đề tương tự trên Ubuntu 16.04, nhưng với sự cố sau: khi virtualenv được kích hoạt ( . venv/bin/activatetrước khi chạy celery worker với pysolr, các yêu cầu, v.v. trong trường hợp của tôi) - mọi thứ hoạt động hoàn hảo, nhưng khi tôi chạy celery từ dòng lệnh sử dụng đường dẫn đầy đủ và đường dẫn python - đã xảy ra sự cố (và sự cố tương tự khi chạy từ giám sát viên). Ngoài ra, nếu quan trọng, virtualenv đã được đóng gói ở những nơi khác trên máy có cùng phiên bản Ubuntu.

Giải pháp rất đơn giản: thêm /full/path/to/venv/binvào PATH (như được khuyên ở đây /server/331027/supervisord-how-to-append-to-path ) đã giải quyết được vấn đề này.

Rất tiếc, tôi vẫn chưa xác định được loại cập nhật nào gây ra sự cố này, nhưng hy vọng điều này có thể giúp ích cho ai đó.


1

Tôi vừa gặp sự cố này trên máy chủ Ubuntu 16.04 của mình. Có vẻ như có xung đột phiên bản giữa các gói apt repo cho python-openssl và python-crypotgraphy, so với những gì ai đó đã cài đặt thủ công bằng pip vào /usr/local/python2.7/dist-packages.

Khi nó rơi vào trạng thái này, pip tiêu chuẩn của hệ thống cũng không thể thực thi. Tôi đã giải quyết vấn đề con gà và quả trứng bằng cách thiết lập thủ công một biến môi trường PYTHONPATH loại trừ phần / usr / local của cây do đó:

    $ 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

Tôi đã có được danh sách các thư mục thư viện ở trên để sử dụng với python shell:

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

và sau đó sao chép mọi thứ được liệt kê ngoại trừ thư mục one / usr / local. Hệ thống của bạn có thể có một danh sách khác trong đường dẫn của nó. Điều chỉnh phù hợp.

Tôi cũng có một số apt-get install --reinstall python-openssl python-cryptographylệnh thủ công nằm rải rác trong lịch sử bash của mình, có thể cần thiết hoặc không.


1

Giải pháp của tôi đơn giản hơn rất nhiều sau khi những giải pháp khác này không hoạt động với tôi. Bất kỳ thứ gì tôi cố gắng cài đặt / gỡ cài đặt qua pip đều trả về cùng một lỗi và stacktrace.

Tôi đã cố gắng cập nhật pip qua pip3 và nó hoạt động hoàn hảo:

pip3 install --upgrade pip

Tôi quay lại sử dụng pip và mọi thứ hoạt động bình thường. Tôi đã nhận thấy rằng nó đang tham chiếu đến Python 3.6 khi chạy các lệnh 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

Hãy thử với:

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

Tôi đã thấy kết xuất ngăn xếp python tương tự trên bảng điều khiển của máy ảo Ubuntu 16.04 của mình khi tôi thử ssh vào máy ảo.

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

pipđã báo cáo rằng pyopensslchưa được cài đặt.

Tôi đã phải làm điều này thay thế:

sudo apt install --reinstall python-openssl

0

Đây là một bài đăng cũ hơn, vì vậy tôi đang trả lời để hy vọng sẽ giúp được ai đó vào cuối năm 2019 ... vấn đề của tôi liên quan đến Python 2 vs 3. Tôi đang sử dụng riêng Python 3; không còn Python kế thừa. Nhưng hệ điều hành của tôi (ví dụ: Ubuntu 16.04) vẫn được cài đặt Python 2.7. Do đó, khi chạy toàn cầu piptheo mặc định (ví dụ: không phải trong virtualenv), tôi đang gọi phiên bản Python 2 của pip.

Đối với tôi, tôi đã sử dụng cách sau để khắc phục sự cố này.

Gỡ cài đặt docker-compose:

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

Cài đặt lại docker-composecho phiên bản Python của tôi:

sudo pip3 install docker-compose

0

Tôi đang chạy OSX 10.15.5 Catalina và sử dụng pyenv.

Tôi đã thử một số giải pháp khác trên trang này, nhưng giải pháp phù hợp với tôi là:

pyenv uninstall 3.6.8
pyenv install 3.6.8

Tôi phải thừa nhận rằng tôi không chắc tại sao điều này lại giải quyết được vấn đề này, bởi vì tôi chỉ mới cài đặt phiên bản Python này khá gần đây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.