Python 如何制作蟒蛇3';s venv使用与我的系统相同的pip3版本';是哪一个?

Python 如何制作蟒蛇3';s venv使用与我的系统相同的pip3版本';是哪一个?,python,python-3.x,pip,virtualenv,ubuntu-16.04,Python,Python 3.x,Pip,Virtualenv,Ubuntu 16.04,我使用的是ubuntu16.04,我总是使用python3-m vevn venv来创建Python的虚拟环境,并使用source venv/bin/active来激活它 我已确保我的全球系统环境的pip3是最新版本,例如,9.0.1,但每次我使用上述命令创建虚拟环境时,最初的venv的pip3版本总是旧版本,例如,8.1.1,这使得系统每次都提醒我升级我的pip3 我已经在我的系统环境中尝试了sudo-apt-get-install-升级python3-venv,但一切都是最新版本 如何使Py

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

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

我已经在我的系统环境中尝试了
sudo-apt-get-install-升级python3-venv
,但一切都是最新版本

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

谢谢。

对于
venv
的前身
pyvenv
也有类似的说法。 以下是答案的相关部分:

EnsureIP包不会从internet下载或从其他任何地方获取文件,因为包中已包含所有必需的组件。这样做会增加安全缺陷,因此不受支持

包的更新频率不如
pip
那么高

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

$python3-m venv-venv&&source-venv/bin/activate&&pip3安装--升级pip

对于
venv
的前身
pyvenv
也有类似的情况。 以下是答案的相关部分:

EnsureIP包不会从internet下载或从其他任何地方获取文件,因为包中已包含所有必需的组件。这样做会增加安全缺陷,因此不受支持

包的更新频率不如
pip
那么高

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


$python3-m venv-venv&&source-venv/bin/activate&&pip3安装--升级pip

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

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

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

>>> import inspect
>>> import venv
>>> print(inspect.getsource(venv))
[the source of venv goes here]
在函数
\u setup\u 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"
这是捆绑在一起的
EnsureIP
版本信息。但是只更改这两行只会导致失败,因为您没有更改local.whl包。那么.whl包在哪里?在这里,它位于函数
引导的源代码中:

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))
    ...
注意我评论的那一行。因此,这告诉我们,.whl文件位于
sure/_bundled/
目录中,您也可以使用
inspect.getsourcefile(ensurepip)
。我得到的是
'c:\\python35\\lib\\ensurepip\\\\uuuu init\uuuu.py'

转到该目录,您将获得两个文件:
pip-8.1.1-py2.py3 none any.whl
setuptools-20.10.1-py2.py3 none any.whl

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

  • 转到
    /your/python/lib/dir/ensurepip/\u bundled/
  • 用命令下载pip-wheel文件,我得到了
    pip-9.0.1-py2.py3-none-any.whl

    $pip下载pip

  • 编辑
    ensurepip
    的源代码。在
    ensurepip/_init__.py
    中,按如下方式编辑并保存:

    # _PIP_VERSION = "8.1.1" # comment this line 
    _PIP_VERSION = "9.0.1" # add this line
    
  • 现在你成功了。要检查pip版本,请执行以下操作:

    $ 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)
    
  • 请注意,不要对
    setuptools
    执行相同的操作,因为它还有一些其他依赖项,这使它变得更加复杂


    Happy hacking:)

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

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

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

    >>> import inspect
    >>> import venv
    >>> print(inspect.getsource(venv))
    [the source of venv goes here]
    
    在函数
    \u setup\u 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"
    
    这是捆绑在一起的
    EnsureIP
    版本信息。但是只更改这两行只会导致失败,因为您没有更改local.whl包。那么.whl包在哪里?在这里,它位于函数
    引导的源代码中:

    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))
        ...
    
    注意我评论的那一行。因此,这告诉我们,.whl文件位于
    sure/_bundled/
    目录中,您也可以使用
    inspect.getsourcefile(ensurepip)
    。我得到的是
    'c:\\python35\\lib\\ensurepip\\\\uuuu init\uuuu.py'

    转到该目录,您将获得两个文件:
    pip-8.1.1-py2.py3 none any.whl
    setuptools-20.10.1-py2.py3 none any.whl

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

  • 转到
    /your/python/lib/dir/ensurepip/\u bundled/
  • 用命令下载pip-wheel文件,我得到了
    pip-9.0.1-py2.py3-none-any.whl

    $pip下载