我的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'
使用pip升级pyopenssl
并不起作用,因为与pip
相关的命令都没有为我工作。通过用pyopenssl
升级easy_install
,可以解决上述问题。
sudo python -m easy_install --upgrade pyOpenSSL
信用@delimiter(Answer)
我在MacOS上遇到了这个问题,通过brew安装了python 2和3。事实证明,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的所有已安装的库并重新开始(并确保从这里开始使用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
我也看到了AttributeError: 'module' object has no attribute 'SSL_ST_INIT'
错误。
干
sudo pip install pyOpenSSL==16.2.0
为我解决了。
就我而言,它在卸载和升级时抛出了同样的错误。我无法卸载或升级。
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
)无效时才尝试此操作
我在Ubuntu 16.04上遇到了同样的问题,但是有以下转折:当virtualenv被激活时(. venv/bin/activate
在运行芹菜工作者之前使用pysolr,请求等等) - 一切都运行得很好,但当我从命令行运行芹菜时使用完整路径和python路径 - 存在问题(从supervisord运行同样的问题)。此外,如果重要的话,virtualenv已经在机器的其他地方与相同的Ubuntu版本捆绑在一起。
解决方案很简单:将/full/path/to/venv/bin
添加到PATH(这里建议https://serverfault.com/questions/331027/supervisord-how-to-append-to-path)解决了这个问题。
不幸的是,我还没有指出哪种更新导致了这种情况,但希望这可能对某些人有所帮助。
以防万一其他人没有找到合适的咒语来完成这项工作,截至2018年11月,对我有用的事情是:
sudo rm -rf /usr/local/lib/python2.7/dist-packages/OpenSSL/
sudo apt install --reinstall python-openssl
祝好运!
我刚刚在我的Ubuntu 16.04主机上遇到过这个问题。 python-openssl和python-crypotgraphy的apt repo软件包之间似乎存在版本冲突,而某些人手动将pip安装到/usr/local/python2.7/dist-packages中。
一旦进入此状态,系统标准点也无法执行。我通过手动设置排除树的/ 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 shell:
import sys
for p in sys.path:
print(p)
然后复制列出的所有内容,除了一个/ usr / local目录。您的系统路径中可能有不同的列表。相应调整。
我也有一些手册apt-get install --reinstall python-openssl python-cryptography
命令分散在我的bash历史中,这可能是也可能不是必需的。
在这些其他解决方案不适合我之后,我的解决方案更加简单化了。我尝试通过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)
试试:
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
当我尝试ssh进入VM时,我在我的Ubuntu 16.04 VM的控制台上看到类似的python堆栈转储。
SSL_ST_INIT = _lib.SSL_ST_INIT
AttributeError: 'module' object has no attribute 'SSL_ST_INIT'
pip
报道没有安装pyopenssl
。
我不得不这样做:
sudo apt install --reinstall python-openssl
原来问题在于我安装了pyOpenSSL,pyOpenSSL-0.15.1。
我做了:
pip uninstall pyopenssl
然后
pip install pyopenssl
...我的Python脚本再次运行!
更新您的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
然后用pip重新安装pyopenssl:
sudo pip install pyopenssl
一切都很好吃。
我最近遇到了同样的问题,经过几个小时的调查,我发现它是由新的加密2.0升级引起的。此升级将使用pyopenssl(如Sentry,Google Analytics等)打破许多软件包。只要将其降级到1.9就可以解决问题。
如果您使用“pip install -U”,请务必小心,它会自动升级requirements.txt中未列出的软件包。
尝试使用以下命令:
easy_install -U pip
easy_install -U pyOpenSSL
在我的情况下,问题是该软件包安装在根目录中,我正在执行使用我的Linux用户forvas要求pyopenssl
的脚本。并且该用户无法使用root中安装的库。
所以首先我必须用aptitude
或apt-get
删除包。
sudo aptitude purge python-openssl
因此,我不得不再次安装软件包,但考虑到正在执行要求库的脚本的用户。根据Linux用户和--user
的pip
参数,查看库的安装位置。
情况1
forvas@server:$ pip install pyopenssl
由于EnvironmentError导致无法安装软件包:
[Errno 13]权限被拒绝:'/ usr / local / lib / python2.7 / did-package / OpenSSL'
考虑使用
--user
选项或检查权限。
案例2
forvas@server:$ sudo pip install pyopenssl
/US人/local/礼拜/Python2.7/第三天-packages/OpenSSL/*
/US人/local/礼拜/Python2.7/第三天-packages/py OpenSSL-17.5.0.第三天-info/*
案例3
forvas@server:$ sudo pip install --user pyopenssl
/home/for VA是/.local/礼拜/Python2.7/site-packages/OpenSSL/*
/home/for VA是/.local/礼拜/Python2.7/site-packages/py OpenSSL-17.5.0.第三天-info/*
案例4
root@server:$ pip install pyopenssl
/US人/local/礼拜/Python2.7/第三天-packages/OpenSSL/*
/US人/local/礼拜/Python2.7/第三天-packages/py OpenSSL-17.5.0.第三天-info/*
案例5
root@server:$ pip install --user pyopenssl
/root/.local/礼拜/Python2.7/site-packages/OpenSSL/*
/root/.local/礼拜/Python2.7/site-packages/py OpenSSL-17.5.0.第三天-info/*
结论
我的问题是该库安装在案例5的目录中。
解
我的问题是由/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安装。
我有同样的问题,因为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
之后一切都按预期工作。