为什么'python3 -m venv myenv'将旧版本的pip安装到myenv中,而不是任何版本的pip,我可以在系统的任何地方找到它?

dus*_*sty 13 python pip python-venv python-3.4

这不会导致我无法通过激活虚拟环境和运行来解决任何问题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)
Run Code Online (Sandbox Code Playgroud)

这是我想要发生的事情:

$ source myenv/bin/activate
(myenv)$ pip -V
UPDATED SYSTEM VERSION HERE WOULD BE NICE
Run Code Online (Sandbox Code Playgroud)

除了在虚拟环境中创建的内容之外,我无法在其他任何地方找到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)
Run Code Online (Sandbox Code Playgroud)

我甚至尝试使用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
Run Code Online (Sandbox Code Playgroud)

我想也许/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)
Run Code Online (Sandbox Code Playgroud)

嗯.也许OS X python有它吗?

$ /usr/bin/python
>>> import pip
>>> pip.__version__
'6.1.1'
Run Code Online (Sandbox Code Playgroud)

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

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

Hal*_*Ali 6

我面临同样的问题,跑步OSX 10.10.2python 3.4.2.最近,我在一debian wheezy台机器中创建了一个虚拟环境,python 3.4.3并且最终得到了pip比可用版本更旧的版本.不得不升级pip.

我一直在升级pip虚拟环境内6.1.16.0.8手动,因为我强迫症有关的软件库版本的方式-是的,我在我的升级python 3版本3.4.3现在.无论如何,我的系统python3-pip是最新版本6.1.1,所以我也想知道为什么要pyvenv创建一个新的虚拟环境并用旧的加载它pip.

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

所以,回答你的问题,它肯定是可能的,并且可能建议升级,因为显然新的pip修复了一些错误并且速度更快,但我想加速并不是那么重要,并且错误修复不会影响所有很多人(我从未遇到过使用旧版本的错误pip).

可以使用该标志--system-site-packages中链接到系统站点包,当你创建一个新的虚拟环境中,这样的

pyvenv myenv --system-site-packages
Run Code Online (Sandbox Code Playgroud)

这将链接到您的系统范围的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)
Run Code Online (Sandbox Code Playgroud)

因此,venv似乎是ensurepip使用该subprocess模块从shell 调用.

再过一分钟google-fu就会从ensurepip文档中给我这个.

ensurepip.version()

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

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

$ python3 -c 'import ensurepip; print(ensurepip.version())' 
6.0.8
Run Code Online (Sandbox Code Playgroud)

显示我pip将要引导的当前电流ensurepip.

我想我们已经坚持使用旧版本的pip每个新安装,直到ensurepip升级,因为我找不到一种方法来升级随附的pip版本ensurepip