Come ottenere "python-m venv" per installare direttamente l'ultima versione di pip




virtualenv python-venv (2)

Come parte del passo della compilazione per una nuova versione di Python, prendo ed get-pip.py , per avere l'ultima pip installata accanto all'eseguibile 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)

Ho 25 di queste versioni in /opt/python , anche se uso principalmente le ultime cinque versioni di ciascuna versione major.minor che non è EOL. Per impostare un invironment ho usato virtualenv o my virtualenvutils con l' -p /opt/python/XYZ/bin/python per ottenere un ambiente virtuale con una versione specifica.

Con Python 3.7 questo dà l'avvertimento di deprecazione del modulo 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.

Spero poco che ciò venga risolto in virtualenv, poiché questo ha avuto un PendingDeprecationWarning almeno dal 2014 (come si può vedere dall'output in questa domanda )

Mentre python -m venv sostituire virtualenv con python -m venv in virtualenvutils , per prima cosa ho creato venv un nuovo ambiente virtuale basato su 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)

Quella ha una vecchia versione pip ! Se lo usi, otterrai:

Stai usando pip versione 10.0.1, tuttavia è disponibile la versione 18.0.
Si dovrebbe prendere in considerazione l'aggiornamento tramite il comando 'pip install --upgrade pip'

Nell'ambiente virtuale creato con virtualenv ottieni immediatamente l'ultima versione:

$ /tmp/py37virtualenv/bin/pip --version
pip 18.0 from /tmp/py37virtualenv/lib/python3.7/site-packages/pip (python 3.7)

Posso eseguire un passaggio post-creazione:

/tmp/py37venv/bin/pip install -U --disable-pip-version-check pip 

che richiederà tempo extra. E se ci fosse un aggiornamento di sicurezza per pip , ciò implicherebbe l'esecuzione della versione non sicura per ottenere una versione sicura, un punto di attacco ideale.

Da virtualenvutils è banale eseguire i vari passaggi per creare un virtualenv senza pip e quindi aggiungere pip usando get-pip.py . Dalla riga di comando questo non è così semplice:

$ /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 da /opt/python/3.7.0/lib/python3.7/site-packages/pip (python 3.7)

Cosa sta causando /opt/python/3.7.0/bin/python -m venv a prendere quella vecchia versione pip ? È quella la versione disponibile al rilascio della 3.7.0?

Come posso aggiornare la mia installazione sotto /opt/python/3.7.0 in qualche modo in modo che usando /opt/python/3.7.0/bin/python -m venv crei un virtualenv con l'ultima versione di pip senza tornare a script, alias o usando più comandi? Avere l'ultimo pip installato in /opt/python/3.7.0 ovviamente non è abbastanza.

Esistono due ruote raggruppate:

/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

Sospetto di dover aggiornare quelli. C'è un modo migliore che aggiornare quelli a mano? Qualche opzione per /some/python -m venv sarebbe buona.

(E eseguendo /some/python -m ensurepip --upgrade non fa il trucco)

L'esecuzione del file /opt/python/3.7.0/bin/pyvenv obsoleto presenta lo stesso vecchio problema di versione pip .


È un comportamento previsto. python -m venv chiama python -m ensurepip per installare pip e Questa risposta mostra che ensurepip installerebbe solo la versione in bundle anche con --upgrade opzione --upgrade . Non esiste alcuna opzione ufficiale per aggiornare il pip bundle e gli strumenti di setuptools .

Beh, non ho nemmeno una buona idea per risolvere questo problema in quanto è solo il comportamento progettato. Vorrei dare due suggerimenti:

  1. Usa pipenv . È veramente buono! E sarà il gestore di pacchetti ufficiale di prossima generazione in futuro (Sebbene ci sia un grosso problema legato all'attuale struttura di Pypi. In breve, un gestore di pacchetti può solo decidere le dipendenze con il download dell'intero pacchetto. Ciò crea un'enorme difficoltà a costruzione del grafico delle dipendenze.).

  2. Implementa il tuo EnvBuilder personalizzato, in realtà c'è un esempio ufficiale a riguardo. E nell'esempio, usa anche get-pip.py per installare l'ultimo pip .


Uso upgrade-ensurepip per aggiornare i file di ruote pip e setuptools che fanno parte del pacchetto ensurepip . Non è così elegante come essere in grado di aggiornare ensurepip pip tramite pip , ma è comunque preferibile farlo manualmente.

PyPI







python-venv