Cómo obtener “python -m venv” para instalar directamente la última versión de pip

Como parte del paso de comstackció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 inventario, 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:

  1. 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.).

  2. Implemente su EnvBuilder personalizado, en realidad hay un ejemplo oficial sobre esto. Y en el ejemplo, también usa get-pip.py para instalar el último pip .