19

这不会给我带来任何我无法通过激活虚拟环境和运行来解决的问题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

除了在虚拟环境中创建的内容之外,我在其他任何地方都找不到 pip 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'

不管我问的是哪个python发行版,无论是OS X的2.7.1,python.org的2.7.9,还是python.org的3.4.3,都会报告6.1.1。

是否可以(或建议)更新放入虚拟环境的 pip 版本?

4

3 回答 3

8

我面临同样的问题,跑步OSX 10.10.2python 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创建一个新的虚拟环境并用 old 加载它pip

由于升级pip,我没有注意到任何虚拟环境中发生任何不好的事情,(但另一方面,我也没有注意到任何好处)显然新的点子更快 - 没有注意到,输出更少成功安装的垃圾,因为用户不在乎 - 也没有注意到,可能是因为我是那些不在乎的人之一,并且还配备了能够拿铁艺术的最先进的咖啡机开机!!!- 仍在等待sudo pip install latte完成:(

因此,要回答您的问题,升级绝对是可能的,并且可能是可取的,因为显然新pip版本修复了一些错误并且速度更快,但我想加速并不是那么重要,并且错误修复不会影响所有那么多人(我从来没有遇到过使用 old 的错误pip)。

可以在创建新的虚拟环境时使用标志 --system-site-packages 链接到系统站点包,如下所示

pyvenv myenv --system-site-packages

这将链接到您的系统范围的 pip 版本,并且将消除在每个虚拟环境中手动升级 pip 的烦恼,但是如果您这样做,那么您的虚拟环境是否都是虚拟的?

更新:在我上面的咆哮之后,我进入了venv包的源代码进行挖掘。由文件中pip调用的方法设置,第 248 行_setup_pip__init__.py

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从外壳调用。subprocess

一分钟的 google-fu 从ensurepip 的文档中给了我这个。

确保pip.version()

返回一个字符串,指定在引导环境时将安装的 pip 的捆绑版本。

因此,从命令行,以下代码:

$ python3 -c 'import ensurepip; print(ensurepip.version())' 
6.0.8

显示pip将使用ensurepip.

pip我想在升级之前,每次新安装我们都会使用旧版本ensurepip,因为我找不到升级附带的 pip 版本的方法ensurepip

于 2015-04-17T03:26:22.073 回答
1

较新

如果你想“热补丁”你安装的 python,只需修改列出的版本ensurepip/__init__.py并替换ensurepip/_bundled. find * | grep ensurepip您可以通过从安装 python 的目录运行来找到此位置。在带有 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
于 2018-11-27T02:58:33.660 回答
0

如果你幸运的话,你可以用 Python 补丁来提升它。

你的 Python 过时了吗?这是使用macports,但任何一个brewapt应该这样做。

port outdated

python36                       3.6.9 < 3.6.10

让我们解决这个问题:

sudo port upgrade python36

现在...鼓声,在我新创建的 venv 中,似乎 Python 补丁带来了最新的pip.

pip --version显示20.0.2,之前是18,这正是它在 venv 中抱怨的内容。

这是在花费大量时间试图弄清楚如何在 Mac 上更新我的用户级 Python 3.6 版本的 pip 之后,当然,如果您退出 virtualenv,您将处于 Python 2.7 和 Python 3.6 的位置,通过 macports 安装,似乎没有 pip 命令可以使用,直到你构建一个 venv

通过查看/opt/local/Library/Frameworks/Python.framework/Versions/3.6,macports 在哪里放置东西,我怀疑 Utknonos 正在做某事,所以 +1。

真的应该有一些更明显的东西,比如一个pip-system-selfupdate命令或一个pip36伴随着python36. 特别是考虑到搜索pip upgrade将返回除此主题之外的任何内容的大量点击

注意:在我更新之后,即使 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)

于 2020-02-29T00:26:05.117 回答