Python中的SSL模块不可用(在OSX上)

40

我在OSX 10.13的虚拟环境中运行pip install遇到了麻烦。我已经运行了brew install openssl并且路径/usr/local/include/openssl指向../opt/openssl/include/openssl。是否有人知道如何解决这个问题?这是在我使用brew install重新安装python后发生的。

pip被配置为需要TLS/SSL的位置,但Python中的ssl模块不可用。正在收集Pillow 无法获取URLhttps://pypi.python.org/simple/pillow/:因为SSL模块不可用,无法连接到HTTPS URL - 跳过 找不到满足要求的Pillow版本(来自版本:)找不到匹配的分发。

更新:下面是更多信息:

✗ which python
/usr/local/opt/python/libexec/bin/python
✗ which pip
/usr/local/opt/python/libexec/bin/pip
✗ python --version
Python 3.7.4
✗ pip --version
pip 19.1.1 from /usr/local/lib/python3.7/site-packages/pip (python 3.7)
✗ brew info python
python: stable 3.7.4 (bottled), HEAD
Interpreted, interactive, object-oriented programming language
https://www.python.org/
/usr/local/Cellar/python/3.6.5_1 (4,795 files, 100.0MB)
  Poured from bottle on 2019-10-08 at 14:39:37
/usr/local/Cellar/python/3.7.4_1 (3,903 files, 60.6MB) *
  Poured from bottle on 2019-10-08 at 14:37:10
From: https://github.com/Homebrew/homebrew-core/blob/master/Formula/python.rb

是的,我已经安装了3.6.5_1和3.7.4_1两个版本,因为有时我需要在两个版本之间切换。

✗ brew unlink openssl
Unlinking /usr/local/Cellar/openssl/1.0.2s... 0 symlinks removed

开始展示 which pythonwhich pip, python --version, pip --version 的输出。然后,据我上次检查,openssl 是 keg-only 的,因此 /usr/local/include/openssl 不应该存在,运行 brew unlink openssl - ivan_pozdeev
@ivan_pozdeev 当然,我已经添加了输出。我已经尝试过 brew unlink - John M.
9个回答

81

ssl 模块和其底层的 C 扩展似乎是 python 公式的一部分:

Mac-Admin:~ admin$ python3
Python 3.7.4 (default, Sep  7 2019, 18:27:02) 
[Clang 10.0.1 (clang-1001.0.46.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> ssl
<module 'ssl' from '/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ssl.py'>
>>> import _ssl
>>> _ssl
<module '_ssl' from '/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload/_ssl.cpython-37m-darwin.so'>

因此,如果缺少这个包,很可能是由于安装程序出现错误,可以通过brew reinstall python来解决。


另外需要注意的是,虽然Homebrew允许多个版本共存,但其安装逻辑并不完全设计用于保持替代版本的运行可用性,除非它们是通过一个有版本号的公式(例如:定期使用brew cleanup删除旧版本)进行安装的。

因此,如果您需要经常在Python版本之间切换,请考虑使用pyenv(也可以通过brew获得)- 或者使用提供了针对版本进行公式化的第三方tap。


10
谢谢!brew reinstall 的确解决了这个问题。 - John M.
1
非常好的提示如何诊断问题。 我的Python安装已经没问题了,重新安装也没有帮助。 然而,使用import ssl命令,我发现我最近通过/usr/local/lib/libssl.3.dylib的符号链接搞乱了我的系统范围内的OpenSSL安装。为了解决这个问题,我只需要删除它(以及/usr/local/lib/libcrypto.3.dylib)。 - undefined

35

Mac OSX Catalina (以及在OSX Mojave上也是同样的问题) Pyenv

对于任何搜索这个主题的人,我有同样的问题,但是我通过Homebrew和Pyenv都安装了Python!!(IMO)最好只使用Pyenv轻松管理版本。正如@ivan_pozdeev在他们的答案中提到的那样,但以下是一些可能需要的详细信息。

如果您的情况类似,上面的解决方案都不足以解决问题。Pyenv相关的答案在这里有所帮助:https://dev59.com/n1QK5IYBdhLWcg3wefv_#51797298 我还碰巧安装了pyenv-virtualenv,因此也提到它,因为通常会同时使用这两个工具。

我最终采取了以下步骤来解决问题:

brew uninstall python
rm -rf $(pyenv root)
brew uninstall pyenv-virtualenv   # you may not have this installed, but...
brew uninstall pyenv

现在,通过Pyenv进行干净的安装:

brew install pyenv
pyenv install 3.6.10  (or whatever version you want)

这为我提供了一个干净、可用的Python 3.6.10安装版本,如果我想要或需要的话,我可以使用Pyenv安装不同版本,并在它们之间进行切换。


我认为我处于同样的情况。现在,如果你只是使用pyenv,那么有必要执行brew uninstall python吗?或者这会在某个地方创建冲突吗?此外,我尝试了brew uninstall python,它给我抛出了错误消息“Error: Refusing to uninstall /usr/local/Cellar/python/3.7.7 because it is required by [a bunch of other packages]”。也许可以放心地执行brew uninstall --ignore-dependencies python的建议,但我仍然有所犹豫。我记不清我如何使用这个版本的python,以及是否还在使用它。 - Antoine
5
@Antoine,我相信我能够在不使用brew重新安装Python的情况下,在pyenv中修复这个问题。但是我确实使用pyenv重新安装了特定版本的Python:pyenv uninstall 3.6.6 pyenv install 3.6.6 pyenv global 3.6.6 - wronk
@wronk 感谢您的建议! 看起来(但我并不完全确定),通过运行 brew uninstall python,我遇到的问题已经消失了,即使它抛出了无法卸载Python的错误。也许在决定不卸载python之前,该命令已进行了一些初步的清理工作?或者也许我做了其他事情。无论如何,我仍然遇到了另一个版本的Python的不同的问题,我想按照您的建议重新安装该版本。 - Antoine
就此而言:我可以确认@wronk提到的方法对我也起作用了,即重新安装pyenv,如上所述,而无需触及使用brew安装的python。 - Juliën
@matt-morgan 谢谢您的这篇文章。请确保您真的需要卸载 Python 和所有这些东西。和 @wronk 一样,我只需安装另一个版本的 Python 就能解决这个问题。例如,我在 Python 3.7.4 上遇到了这个问题,所以我只是安装了 3.7.5 版本。 - khashashin

7
这个问题可能是由于你的Python发行版使用了错误版本的OpenSSL编译而导致的。
引用:
支持OpenSSL 1.1.x的Python版本为2.7.13、3.5.3和3.6.0(详见https://github.com/pyenv/pyenv/issues/950#issuecomment-562366902)。
因此,如果你尝试安装旧版本的Python,你必须先使用brew卸载新版本的openssl,然后再使用pyenv安装旧版本的Python。
brew uninstall --ignore-dependencies openssl@1.1
pyenv uninstall 3.5.2  # deinstall old versions compiled with the wrong version of openssl
pyenv install 3.5.2

另一方面,如果您尝试安装更新的Python版本,请确保在使用pyenv安装之前已安装了最新版本的openssl。
brew upgrade openssl
pyenv uninstall 3.7.4 # deinstall old versions compiled with the wrong version of openssl
pyenv install 3.7.4

我有大约20个虚拟环境。将.pyenv/versions/x.x.x/envs目录移动到临时位置后,我能够卸载/重新安装Python版本以修复OpenSSL,然后将envs移回并使它们再次正常工作。 - Arne Claassen

5
我在使用Catalina时遇到了类似的问题,homebrew重装无法正常进行。我尝试了几种方法。
brew reinstall openssl
brew reinstall pyenv
brew reinstall pyenv-virtualenv

最终,对我有效的方法是彻底卸载这两个软件以及其基础 Python 安装,然后重新安装所有内容。

brew uninstall pyenv pyenv-virtualenv
brew install pyenv pyenv-virtualenv
pyenv uninstall 3.x.x
pyenv install 3.x.x
pip install -r requirements.txt

执行 brew uninstall pyenv pyenv-virtualenv 命令是否不能像 pyenv uninstall 3.x.x 命令建议的那样删除所有虚拟环境? - Antoine
@Antoine 不,它不会。然而,在这种情况下,你可能也需要手动删除它们。另外,使用 requirements.txt 文件非常有用,可以在多个场合为你节省时间,因为这些开发 Python 环境往往会不时出现问题。 - Kosiek

5

我的解决方法是重新安装pyenv和Python。

 brew uninstall pyenv pyenv-virtualenv
 brew install pyenv pyenv-virtualenv
 pyenv uninstall 3.6.5
 pyenv install 3.6.5

2

我也遇到了这个错误,我用brew update && brew upgrade命令解决了它。


1

我遇到了同样的错误,原因是我在pyenv环境中使用了Python 3.6.5。以下方法对我有效。

pyenv install 3.7.3
pyenv global 3.7.3

0

我在macOS Monterey和Anaconda上也遇到了这个问题。SSL模块可以在基本环境中找到,但在另一个环境中却找不到。

我通过以下方法解决了这个问题:

conda activate my_env
conda update --all

之后,我开始遇到一个新的错误,即找不到libzmq,因此我按照Anaconda.org上的说明安装了Zeromq。

conda install -c anaconda zeromq

重新启动了终端,现在环境中的一切都正常工作了!


0

我遇到了同样的错误。我尝试重新安装OpenSSL,但没有帮助。最后我去了https://www.python.org/下载了最新的官方/稳定版本安装程序并运行它。这解决了我的问题。

这可能有些过度了,但至少解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接