私の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'
問題はpyOpenSSLのインストール、pyOpenSSL-0.15.1にあることが判明しました。
やった:
pip uninstall pyopenssl
その後
pip install pyopenssl
...そして私のPythonスクリプトはまたうまくいった!
pyopenssl
に関連するコマンドがどれも私のために働いていなかったのでpipでpip
をアップグレードすることは働いていませんでした。 pyopenssl
をeasy_install
にアップグレードすることで、上記の問題を解決できます。
Sudo python -m easy_install --upgrade pyOpenSSL
credit @delimiter( Answer )
pyopenssl
モジュールを更新します。
$ Sudo pip install -U pyopenssl
私は最近同じ問題を経験しました、そして数時間の調査の後、私はそれがNew cryptography 2. upgradeによって引き起こされたことを知りました。このアップグレードはpyopensslを使った多くのパッケージ(Sentry、Google Analyticsなど)を壊すでしょう。 1.9にダウングレードするだけで問題は解決します。
"pip install -U"を使用している場合は注意してください。これはRequirements.txtにリストされていないパッケージを自動的にアップグレードします。
私は同じようなエラーがありました:
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
それからpipでpyopensslを再インストールしました:
Sudo pip install pyopenssl
そしてすべてが肉汁だった。
私はこれを助けました:
$ easy_install -U pip $ easy_install -U pyOpenSSL
私の場合、問題はパッケージがルートディレクトリにインストールされていて、私は自分のLinuxユーザーでpyopenssl
を要求するスクリプトを実行していたforvas。そしてそのユーザーはrootにインストールされたライブラリを使うことができません。
だから最初に私はaptitude
かapt-get
でパッケージを削除しなければなりませんでした。
Sudo aptitude purge python-openssl
そのため、パッケージを再度インストールする必要がありましたが、ライブラリを要求しているスクリプトを実行しているユーザーを考慮しました。 Linuxユーザーとpip
の引数--user
に応じて、ライブラリーがインストールされている場所を調べてください。
ケース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/*
ケース
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ユーザーが利用できます)またはより正確なオプション(このライブラリはLinuxユーザーのみが利用できますforvas).
私はbrew経由でインストールされたpython 2と3でMacOSでこの問題を抱えていました。 brew uninstall
ing pythonとpython @ 2は、それらのバージョンのpython用にインストールされたライブラリを削除しません。すなわち:
/usr/local/lib/python3.7/site-packages/
と/usr/local/lib/python2.7/site-packages/
そこに何かが正しくなかったので、私のために働いたのはbrewのpython 2と3のためにインストールされているすべてのライブラリを削除/移動してから再開することです
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
私の問題は/usr/lib/python2.7/dist-packages/
にあったPython 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インストールを実行することができました。
私の場合、それはアンインストールとアップグレードのために同じエラーを投げていました。アンインストールまたはアップグレードできませんでした。
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
WARNING:アップグレード(Sudo pip install pyOpenSSL==16.2.0
)またはアンインストール(pip uninstall pyopenssl
)で解決しない場合にのみ試してください。
これらの他の解決策が私のために働かなかった後私の解決策ははるかに単純化されました。私がpipでインストール/アンインストールしようとしたものはすべて、同じエラーとスタックトレースを返しました。
私はpip3経由でpipを更新しようとしましたが、それは完璧に動作しました:
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)
万が一他の誰かがこの仕事をするための正しい呪文を正確に見つけていないのですが、2018年11月の時点で私のために働いていたのは次のとおりです。
Sudo rm -rf /usr/local/lib/python2.7/dist-packages/OpenSSL/ Sudo apt install --reinstall python-openssl
がんばろう!
私はUbuntu 16.04でも同じ問題を抱えていましたが、次のようなひねりを加えました。(私の場合は、pysolrを使ってceleryワーカーを実行する前の. venv/bin/activate
、要求など) - パス、そしてpythonのパス - 問題がありました(そしてsupervisordから走っている同じ問題)。また、重要であれば、virtualenvは同じUbuntuバージョンのマシンの他の場所にバンドルされています。
解決方法は簡単でした。PATHに/full/path/to/venv/bin
を追加すると(ここで推奨されているように https://serverfault.com/questions/331027/supervisord-how-to-append-to-path )、これが解決されました。
残念ながら、これが原因でどのような更新が行われたのか、私はまだ正確に指摘していませんが、これが誰かに役立つことを願っています。
私がUbuntu 16.04 VMのコンソールに同じように pythonのスタックダンプを表示していました。
SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'
Pipはpyopensslがインストールされていないと報告しました。
私は代わりにこれをしなければなりませんでした:
$ apt install --reinstall python-openssl
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'
エラーも見ました。
やる
Sudo pip install pyOpenSSL==16.2.0
私のためにそれを解決しました。
私は同じ問題を抱えていました、そして、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
その後、すべてが期待通りに動作しました。
私はちょうど私のUbuntu 16.04ホストでこれに遭遇しました。 python-opensslとpython-crypotgraphyのaptリポジトリパッケージの間にバージョンの衝突があるようです。
この状態になると、システム標準のpipも実行できなくなります。このようにして、ツリーの/ usr/local部分を除外したPYTHONPATH環境変数を手動で設定することで、鶏と卵の問題を回避しました。
$ 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ディレクトリ以外のリストされているものすべてをコピーします。あなたのシステムはそのパスに別のリストを持っているかもしれません。それに応じて調整してください。
私のbash履歴には、手動のapt-get install --reinstall python-openssl python-cryptography
コマンドが散在していましたが、これは必要な場合とそうでない場合があります。
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 "apt -get install --reinstall python-openssl