我使用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的版本?
感谢。
答案 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.whl
,setuptools-20.10.1-py2.py3-none-any.whl
。
我上面写的只是为了让您了解我们正在做什么,以下是您需要做的事情:
/your/python/lib/dir/ensurepip/_bundled/
。使用命令下载pip wheel文件,我得到了pip-9.0.1-py2.py3-none-any.whl
:
$ pip download pip
修改ensurepip
的来源。在ensurepip/__init__.py
中,像这样编辑并保存:
# _PIP_VERSION = "8.1.1" # comment this line
_PIP_VERSION = "9.0.1" # add this line
现在你做到了。检查点数版本:
$ 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
执行相同的操作,因为它有一些其他依赖项,使其更复杂。
快乐的黑客攻击:)
答案 2 :(得分:0)