如何让Python3的venv使用与我的系统相同版本的pip3?

时间:2017-04-16 13:07:24

标签: python python-3.x pip virtualenv ubuntu-16.04

我使用Ubuntu 16.04,我总是使用python3 -m vevn venv创建我的Python虚拟环境,并使用source venv/bin/active来激活它。

我确保我的全局系统环境pip3是最新版本,例如9.0.1,但每次我使用所述命令创建虚拟环境上面,最初的venv的pip3版本总是较旧版本,例如8.1.1,这使系统提醒我每次都升级我的pip3。

我在我的系统环境中尝试了sudo apt-get install --upgrade python3-venv,但所有内容都是最新版本。

如何让Python3的venv使用与我的系统相同版本的pip3,这样我每次创建虚拟环境时都不必升级pip3?如何确定venv的pip3的版本?

感谢。

3 个答案:

答案 0 :(得分:0)

pyvenv的前身venv有类似的question。 这是答案的相关部分:

  

Ensurepip包不会从互联网上下载或从其他任何地方获取文件,因为所有必需的组件都已包含在包中。这样做会增加安全漏洞,因此不受支持。

包裹不会像pip那样经常更新。

我使用以下命令设置了热键来解决问题:

$ python3 -m venv venv && source venv/bin/activate && pip3 install --upgrade pip

答案 1 :(得分:0)

我设法在我的Windows上安装了最新版本。但是这种方法可能会导致安全问题在尝试这个之前,请注意你在做什么

我只在Windows上的Python 3.5.2上测试过它。如果您使用的是Python2.x,最好不要尝试。

首先,找出venv使用的版本。使用:

>>> import inspect
>>> import venv
>>> print(inspect.getsource(venv))
[the source of venv goes here]

你会发现在函数_setup_pip的定义中:

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)

这个函数告诉我们pip是由另一个名为ensurepip的python包安装的。因此,我们将使用以下内容转到ensurepip的来源:

>>> import ensurepip
>>> print(inspect.getsource(ensurepip))
[the source of ensure pip goes here]

在源头的前几行中,您将得到:

_SETUPTOOLS_VERSION = "20.10.1"
_PIP_VERSION = "8.1.1"

这是ensurepip捆绑的版本信息。但只更改这两行只会导致失败,因为您还没有更改本地.whl包。那么.whl包在哪里?这里是函数bootstrap中的源代码:

def bootstrap(*, root=None, upgrade=False, user=False,
              altinstall=False, default_pip=False,
              verbosity=0):
    ...
    with tempfile.TemporaryDirectory() as tmpdir:
    # Put our bundled wheels into a temporary directory and construct the
    # additional paths that need added to sys.path
    additional_paths = []
    for project, version in _PROJECTS: # *pay attention to these lines*
        wheel_name = "{}-{}-py2.py3-none-any.whl".format(project, version)
        whl = pkgutil.get_data(
            "ensurepip",
            "_bundled/{}".format(wheel_name),
        )
        with open(os.path.join(tmpdir, wheel_name), "wb") as fp:
            fp.write(whl)

        additional_paths.append(os.path.join(tmpdir, wheel_name))
    ...

注意我评论的内容。所以这告诉我们,位于ensure/_bundled/目录中的.whl文件,您也可以使用inspect.getsourcefile(ensurepip)。我得到的是'c:\\python35\\lib\\ensurepip\\__init__.py'

转到此目录,您有两个文件:pip-8.1.1-py2.py3-none-any.whlsetuptools-20.10.1-py2.py3-none-any.whl

我上面写的只是为了让您了解我们正在做什么,以下是您需要做的事情

  1. 转到/your/python/lib/dir/ensurepip/_bundled/
  2. 使用命令下载pip wheel文件,我得到了pip-9.0.1-py2.py3-none-any.whl

    $ pip download pip

  3. 修改ensurepip的来源。在ensurepip/__init__.py中,像这样编辑并保存:

    # _PIP_VERSION = "8.1.1" # comment this line 
    _PIP_VERSION = "9.0.1" # add this line
    
  4. 现在你做到了。检查点数版本:

    $ python -m venv testpip
    $ cd testpip
    $ .\Scripts\activate.bat (in Linux, use '$ source ./bin/activate' instead.)
    (testpip) $ pip --version
    pip 9.0.1 from the \your\venv\testpip\lib\site-packages (python 3.5)
    
  5. 请注意,不要对setuptools执行相同的操作,因为它有一些其他依赖项,使其更复杂。

    快乐的黑客攻击:)

答案 2 :(得分:0)

创建你的venv using --system-site-packages

python3 -m venv --system-site-packages venv

你将使用系统的pip3。