这不会导致我通过激活虚拟环境并运行pip install -U pip
来解决任何问题,但我总是想知道旧版本的pip来自何处。
我使用OS X 10.7.5。当我使用pyvenv-3.4 myenv
或python3 -m venv myenv
创建虚拟环境时,安装在虚拟环境中的pip版本是6.0.8,但我已将我的全局pip升级到6.1.1。
这是一个终端会议,展示了我的意思:
$ python3 -m venv myenv
$ myenv/bin/pip -V
pip 6.0.8 from /Users/dust/Desktop/myenv/lib/python3.4/site-packages (python 3.4)
以下是我想要发生的事情:
$ source myenv/bin/activate
(myenv)$ pip -V
UPDATED SYSTEM VERSION HERE WOULD BE NICE
除了在虚拟环境中创建的内容之外,我无法在其他任何地方找到点6.0.8。
以下是我用来尝试解决这些问题的各种命令的输出:
$ which pip
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip
$ which pip3
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip3
$ pip -V
pip 6.1.1 from /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages (python 3.4)
$ pip3 -V
pip 6.1.1 from /Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages (python 3.4)
我甚至尝试过使用find:
$ find / -type f -name pip 2>&1 | awk '! /^f.*$/'
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip
/usr/local/bin/pip
$ find / -type f -name pip3 2>&1 | awk '! /^f.*$/'
/Library/Frameworks/Python.framework/Versions/3.4/bin/pip3
我想也许/usr/local/bin/pip
可能是罪魁祸首,但不是:
$ /usr/local/bin/pip -V
pip 6.1.1 from /Library/Python/2.7/site-packages/pip-6.1.1-py2.7.egg (python 2.7)
嗯。也许OS X python有它吗?
$ /usr/bin/python
>>> import pip
>>> pip.__version__
'6.1.1'
6.1.1报告无论我问哪个python发行版,无论是OS X的2.7.1,python.org的2.7.9,还是python.org的3.4 0.3。
是否可以(或建议)更新放入虚拟环境的pip版本?
答案 0 :(得分:5)
我遇到同样的问题,正在运行OSX 10.10.2
和python 3.4.2
。最近,我使用debian wheezy
在python 3.4.3
计算机中创建了一个虚拟环境,最终得到的pip
版本比可用版本高pip
。必须升级pip
。
我已经手动将虚拟环境中的6.1.1
从6.0.8
升级到python 3
,因为我对软件库版本采用了这种方式 - 是的,我正在将3.4.3
版本升级到python3-pip
。无论如何,我的系统6.1.1
是最新版本pyvenv
,所以我也想知道为什么pip
创建一个新的虚拟环境并用旧版{{1}加载它}}
我没有注意到由于升级pip
而在任何虚拟环境中发生了任何不良事件,(但另一方面,我也没有注意到任何好事)显然是新的点子更快 - 没有注意到,并且在成功安装时输出的垃圾更少,因为用户不在乎 - 也没有注意到,可能是因为我是其中之一不关心,还配备了最先进的咖啡机,能够拿铁艺术! - 仍在等待sudo pip install latte
完成:(
所以,为了回答你的问题,它肯定是可能的,并且可能是可取的升级,因为显然新的pip
修复了一些错误并且更快,但我想加速不是那个主要的并且错误修复不会影响所有人(我从未遇到过使用旧版pip
的错误)。
当您创建新的虚拟环境时,您可以使用标志--system-site-packages链接到系统站点包,例如
pyvenv myenv --system-site-packages
这将链接到系统范围的pip版本,并且会消除在每个虚拟环境中手动升级pip的烦恼,但是如果你这样做,那么你的虚拟环境是虚拟环境吗?
更新:在我上面的咆哮之后,我进入了venv
软件包的源代码来挖掘。 pip
由文件_setup_pip
中的__init__.py
方法设置,第248行
def _setup_pip(self, context):
"""Installs or upgrades pip in a virtual environment"""
# We run ensurepip in isolated mode to avoid side effects from
# environment vars, the current directory and anything else
# intended for the global Python environment
cmd = [context.env_exe, '-Im', 'ensurepip', '--upgrade',
'--default-pip']
subprocess.check_output(cmd, stderr=subprocess.STDOUT)
所以,venv似乎是使用ensurepip
模块从shell调用subprocess
。
google-fu的另一分钟从documentation for ensurepip给了我这个。
ensurepip.version()
返回一个字符串,指定在引导环境时将安装的pip的捆绑版本。
因此,从命令行,以下代码:
$ python3 -c 'import ensurepip; print(ensurepip.version())'
6.0.8
显示我将使用pip
引导的当前ensurepip
。
我想在pip
升级之前,每次新安装我都会遇到旧版ensurepip
,因为我无法找到升级pip版本的方法随ensurepip
答案 1 :(得分:0)
如果要“热补丁”已安装的python,只需修改ensurepip/__init__.py
中列出的版本并替换ensurepip/_bundled
中的两个文件。您可以通过在安装python的目录中运行find * | grep ensurepip
来找到此位置。在具有Homebrew的macOS上,该位置为:/usr/local/Cellar/python/3.7.1/Frameworks/Python.framework/Versions/3.7/lib/python3.7/ensurepip
您还将要删除包含ensurepip/__pycache__
个文件的.pyc
目录。
在从源代码构建Python之前,您可以通过修补Python来更新pip和setuptools的捆绑版本。以下补丁会将pip和setuptools的捆绑版本更新为当前可用的版本。您将需要使用以下选项来调用configure
:--with-ensurepip=upgrade
这些whl
文件是从PYPI此处下载的:
https://pypi.org/project/pip/#files
https://pypi.org/project/setuptools/#files
diff -ru Python-3.7.1/Lib/ensurepip/__init__.py Python-3.7.1.new/Lib/ensurepip/__init__.py
--- Python-3.7.1/Lib/ensurepip/__init__.py 2018-10-20 06:04:19.000000000 +0000
+++ Python-3.7.1.new/Lib/ensurepip/__init__.py 2018-11-27 02:36:19.301655008 +0000
@@ -8,9 +8,9 @@
__all__ = ["version", "bootstrap"]
-_SETUPTOOLS_VERSION = "39.0.1"
+_SETUPTOOLS_VERSION = "40.6.2"
-_PIP_VERSION = "10.0.1"
+_PIP_VERSION = "18.1"
_PROJECTS = [
("setuptools", _SETUPTOOLS_VERSION),
Only in Python-3.7.1/Lib/ensurepip/_bundled: pip-10.0.1-py2.py3-none-any.whl
Only in Python-3.7.1.new/Lib/ensurepip/_bundled: pip-18.1-py2.py3-none-any.whl
Only in Python-3.7.1/Lib/ensurepip/_bundled: setuptools-39.0.1-py2.py3-none-any.whl
Only in Python-3.7.1.new/Lib/ensurepip/_bundled: setuptools-40.6.2-py2.py3-none-any.whl
答案 2 :(得分:0)
您的Python是否过时了?这正在使用macports
,但是brew
,apt
中的任何一个都可以。
port outdated
python36 3.6.9 < 3.6.10
让我们解决这个问题
sudo port upgrade python36
现在……在我重新创建的venv中,鼓声似乎是Python补丁带来了最新的pip
。
pip --version
会显示 20.0.2 ,之前是 18 ,而这恰恰是它在静脉曲张中所抱怨的。
这是在花费大量时间试图弄清楚如何在Mac上更新用户级别的Python 3.6版本的pip之后,当然,如果退出virtualenv,您将使用Python 2.7,通过macports安装的Python 3.6似乎没有pip命令可以使用,直到您构建venv 。
通过查看Macports放置的东西 /opt/local/Library/Frameworks/Python.framework/Versions/3.6 ,我怀疑Utknonos是某个东西,所以+1。
确实应该有一些更明显的东西,例如pip-system-selfupdate
命令或pip36
附带的python36
。尤其要考虑的是,搜索 pip升级会返回除此主题之外的任何内容的点击量。
注意:我的更新后,即使Python已更新
(venv)$ pwd
/opt/local/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6
(venv)$ grep PIP_VERSION ensurepip/__init__.py
_PIP_VERSION = "18.1"
(venv) $python --version
Python 3.6.10
(venv) $pip --version
pip 20.0.2 from .../venv/lib/python3.6/site-packages/pip (python 3.6)