Cómo obtener "python-m venv" para instalar directamente la última versión de pip
virtualenv python-venv (2)
Como parte del paso de compilación para una nueva versión de python, busco y ejecuto
get-pip.py
, para tener el último pip instalado junto al ejecutable de 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)
Tengo 25 versiones de este tipo en
/opt/python
, aunque principalmente uso las cinco últimas versiones de cada versión major.minor que no es EOL.
Para configurar un entorno, solía ejecutar
virtualenv
o mis
virtualenvutils
con la
-p /opt/python/XYZ/bin/python
para obtener un entorno virtual con una versión específica.
Con Python 3.7 esto da la advertencia de desaprobación del 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.
Tengo pocas esperanzas de que esto se resuelva en virtualenv, ya que ha tenido una
PendingDeprecationWarning
de
PendingDeprecationWarning
al menos desde 2014 (como se puede ver en el resultado de
esta pregunta
)
Mientras investigaba la sustitución de
virtualenv
con
python -m venv
en
virtualenvutils
, primero creé a mano un nuevo
venv
virtual basado en
venv
:
$ /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)
Eso tiene una versión antigua de
pip
!
Si lo usas, obtendrás:
Está utilizando la versión pip 10.0.1, sin embargo, la versión 18.0 está disponible.
Debería considerar la actualización a través del comando ''pip install --upgrade pip''
En el entorno virtual creado con
virtualenv
, obtienes inmediatamente la última versión:
$ /tmp/py37virtualenv/bin/pip --version
pip 18.0 from /tmp/py37virtualenv/lib/python3.7/site-packages/pip (python 3.7)
Puedo ejecutar un paso posterior a la creación:
/tmp/py37venv/bin/pip install -U --disable-pip-version-check pip
lo que llevará tiempo extra.
Y si hubiera alguna actualización de seguridad para
pip
, esto implicaría ejecutar la versión no segura para obtener una versión segura, un punto ideal de ataque.
Desde
virtualenvutils
es trivial hacer los múltiples pasos para crear un virtualenv sin
pip
y luego agregar
pip
usando
get-pip.py
.
Desde la línea de comandos esto no es tan simple:
$ /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)
¿Qué está causando que
/opt/python/3.7.0/bin/python -m venv
tome esa versión
pip
antigua?
¿Es esa la versión disponible cuando se lanzó 3.7.0?
¿Cómo puedo actualizar mi instalación en
/opt/python/3.7.0
de alguna manera para que usando
/opt/python/3.7.0/bin/python -m venv
cree un virtualenv con la última versión de
pip
sin volver a los scripts, alias? o utilizando varios comandos?
Tener el último
pip
instalado en
/opt/python/3.7.0
obviamente no es suficiente.
Hay dos ruedas agrupadas:
/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
Sospecho que necesito actualizar esos.
¿Hay alguna forma mejor que actualizarlos a mano?
Alguna opción para
/some/python -m venv
estaría bien.
(Y ejecutar
/some/python -m ensurepip --upgrade
no hace el truco)
Ejecutar el
/opt/python/3.7.0/bin/pyvenv
desuso tiene el mismo problema de la versión
pip
.
Es un comportamiento esperado.
python -m venv
llama a
python -m ensurepip
para instalar
pip
y
Esta respuesta
muestra que
ensurepip
solo instalaría la versión incluida incluso con la opción
--upgrade
.
No hay ninguna opción oficial para actualizar el
pip
incluido y las
setuptools
.
Bueno, tampoco tengo una buena idea para solucionar este problema, ya que simplemente es el comportamiento diseñado. Me gustaría dar dos sugerencias:
-
Utilice
pipenv
. ¡Es realmente bueno! Y será el gestor de paquetes oficial de la próxima generación en el futuro (aunque hay un gran problema relacionado con la estructura actual de Pypi. En resumen, un gestor de paquetes solo puede decidir las dependencias con la descarga de todo el paquete. Esto supone una gran dificultad para Construcción de dependencias gráficas.). -
Implemente su
EnvBuilder
personalizado, en realidad hay un ejemplo oficial sobre esto. Y en el ejemplo, también usaget-pip.py
para instalar el últimopip
.
Uso
upgrade-ensurepip
para actualizar los archivos
pip
y
setuptools
que forman parte del paquete
ensurepip
.
No es tan elegante como poder actualizar
ensurepip
través de
pip
, pero aún así es preferible hacerlo manualmente.