PyOpenSSl version 0.13.1 after pip upgrade

2019-07-10 01:25发布

问题:

I am on Mac El Capitan. My system shows me stuck on PyOpenSSl version 0.13.1. When I upgrade to 16.2.0, the upgrade is successful. However, when I check the version, it's still on 0.13.1. Why is this?

MacBook-Air:include$ sudo pip install pyopenssl --user --upgrade
Password:
The directory '/Users/Library/Caches/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/Users/Library/Caches/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pyopenssl
  Downloading pyOpenSSL-16.2.0-py2.py3-none-any.whl (43kB)
    100% |████████████████████████████████| 51kB 1.1MB/s
Requirement already up-to-date: cryptography>=1.3.4 in /Library/Python/2.7/site-packages (from pyopenssl)
Collecting six>=1.5.2 (from pyopenssl)
  Downloading six-1.10.0-py2.py3-none-any.whl
Requirement already up-to-date: cffi>=1.4.1 in /Library/Python/2.7/site-packages (from cryptography>=1.3.4->pyopenssl)
Requirement already up-to-date: pyasn1>=0.1.8 in /Library/Python/2.7/site-packages (from cryptography>=1.3.4->pyopenssl)
Collecting setuptools>=11.3 (from cryptography>=1.3.4->pyopenssl)
  Downloading setuptools-32.3.1-py2.py3-none-any.whl (479kB)
    100% |████████████████████████████████| 481kB 1.3MB/s
Requirement already up-to-date: idna>=2.0 in /Library/Python/2.7/site-packages (from cryptography>=1.3.4->pyopenssl)
Requirement already up-to-date: ipaddress in /Library/Python/2.7/site-packages (from cryptography>=1.3.4->pyopenssl)
Requirement already up-to-date: enum34 in /Library/Python/2.7/site-packages (from cryptography>=1.3.4->pyopenssl)
Requirement already up-to-date: pycparser in /Library/Python/2.7/site-packages (from cffi>=1.4.1->cryptography>=1.3.4->pyopenssl)
Installing collected packages: six, pyopenssl, setuptools

And then checking the version, it's the wrong one:

Successfully installed pyopenssl-16.2.0 setuptools-32.3.1 six-1.10.0
MacBook-Air:include$ pip show pyopenssl
Name: pyOpenSSL
Version: 0.13.1
Summary: Python wrapper module around the OpenSSL library
Home-page: http://pyopenssl.sourceforge.net/
Author: Jean-Paul Calderone
Author-email: exarkun@twistedmatrix.com
License: APL2
Location: /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python
Requires:

回答1:

The core of the problem is that sudo pip install pyopenssl --user --upgrade was installing into a directory where the "non-sudo" pip ... did not look first. There are many reasons why that might happen.

The first aspect to simplify this problem is understanding that pip install --user ... should never need to be run with sudo. The --user option means install into the user packages directory (it should be under /Users/your_username/ somewhere), and advanced privileges are not needed for that.

If you try pip install --user --upgrade pyopenssl without sudo, it should solve the problem.

The old pyopenssl-0.13.1 will still exist in /System/Library/Frameworks/Python.framework/Versions/2.7/... , however the new one should now exist in /Users/your_username/... and should be found first by the Python import machinery.

However, there is a reasonable chance that pip install --user is installing the new version of pyopenssl in a directory where the Python import machinery doesnt look. To fix this, you need to know where pip is installing the package. Try using pip install --user --verbose .. if the default pip output it doesnt tell you were the package is being installed. Then you need to add this path to PYTHONPATH, such as the following with ... replaced with where pip installed the package (it should be under /Users/your_username/ somewhere).

export PYTHONPATH="/Users/your_username/Library/...:$PYTHONPATH"
pip show pyopenssl

If that works, add the above export .. to your bash .profile so that your Python runtime is always loading packages from that directory first.