Como fazer com que o “python -m venv” instale diretamente a versão mais recente do pip
Como parte da etapa de compilação de uma nova versão python, busco e corroget-pip.py
, para ter o pip mais recente instalado ao lado do executável python:
$ /opt/python/3.7.0/bin/python --version
Python 3.7.0
$ /opt/python/3.7.0/bin/pip --version
pip 18.0 from /opt/python/3.7.0/lib/python3.7/site-packages/pip (python 3.7)
Eu tenho 25 dessas versões em/opt/python
, embora eu use principalmente as cinco versões mais recentes de cada versão major.minor que não é EOL. Para configurar um invorment eu costumava executarvirtualenv
Ou meuvirtualenvutils
com o-p /opt/python/X.Y.Z/bin/python
opção para obter um ambiente virtual com uma versão específica.
Com o Python 3.7, isso fornece o aviso de descontinuação do módulo imp:
$ virtualenv -p /opt/python/3.7.0/bin/python /tmp/py37virtualenv
Running virtualenv with interpreter /opt/python/3.7.0/bin/python
Using base prefix '/opt/python/3.7.0'
/opt/util/virtualenvutils/lib/python3.6/site-packages/virtualenv.py:1041: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
import imp
New python executable in /tmp/py37virtualenv/bin/python
Installing setuptools, pip, wheel...done.
Tenho pouca esperança de que isso seja resolvido no virtualenv, pois isso teve umPendingDeprecationWarning
pelo menos desde 2014 (como pode ser visto na saída emessa questão)
Ao investigar a substituiçãovirtualenv
compython -m venv
novirtualenvutils
, Eu criei um novovenv
ambiente virtual baseado em mão:
$ /opt/python/3.7.0/bin/python -m venv /tmp/py37venv
$ /tmp/py37venv/bin/pip --version
pip 10.0.1 from /tmp/py37venv/lib/python3.7/site-packages/pip (python 3.7)
Que tem um velhopip
versão! Se você usá-lo, receberá:
Você está usando o pip versão 10.0.1, no entanto, a versão 18.0 está disponível.
Você deve considerar a atualização através do comando 'pip install --upgrade pip'
No ambiente virtual criado comvirtualenv
você obtém imediatamente a versão mais recente:
$ /tmp/py37virtualenv/bin/pip --version
pip 18.0 from /tmp/py37virtualenv/lib/python3.7/site-packages/pip (python 3.7)
Eu posso executar uma etapa de pós-criação:
/tmp/py37venv/bin/pip install -U --disable-pip-version-check pip
o que levará tempo extra. E se houver alguma atualização de segurança parapip
, isso implicaria executar a versão não segura para obter uma versão segura, um ponto de ataque ideal.
Devirtualenvutils
é trivial executar as várias etapas para criar umpip
-less virtualenv e adicionepip
usandoget-pip.py
. Na linha de comando, isso não é tão simples:
$ /opt/python/3.7.0/bin/python -m venv --without-pip /tmp/py37venvnopip
$ /tmp/py37venvnopip/bin/python -c "from urllib.request import urlopen; response = urlopen('https://bootstrap.pypa.io/get-pip'); open('/tmp/tmp_get_pip.py', 'w').write(response.read())"
$ /opt/python/3.7.0/bin/python /tmp/tmp_get_pip.py
......
$ /opt/python/3.7.0/bin/pip --version
pip 18.0 de /opt/python/3.7.0/lib/python3.7/site-packages/pip (python 3.7)
O que está causando/opt/python/3.7.0/bin/python -m venv
pegar aquele velhopip
versão? Essa versão está disponível quando o 3.7.0 foi lançado?
Como posso atualizar minha instalação em/opt/python/3.7.0
de alguma forma, para que usando/opt/python/3.7.0/bin/python -m venv
cria um virtualenv com o mais recentepip
versão sem reverter para scripts, aliases ou usar vários comandos? Tendo o mais recentepip
instalado sob/opt/python/3.7.0
obviamente não é suficiente.
Existem duas rodas empacotadas:
/opt/python/3.7.0/lib/python3.7/ensurepip/_bundled/setuptools-39.0.1-py2.py3-none-any.whl
/opt/python/3.7.0/lib/python3.7/ensurepip/_bundled/pip-10.0.1-py2.py3-none-any.whl
Eu suspeito que preciso atualizá-los. Existe uma maneira melhor do que atualizá-los manualmente? Alguma opção para/some/python -m venv
seria bom.
(E correndo/some/python -m ensurepip --upgrade
não faz o truque)
Executando o Reprovado/opt/python/3.7.0/bin/pyvenv
tem o mesmo velhopip
problema de versão.