Réinstallez automatiquement les packages dans l'environnement virtuel après la mise à niveau de la version majeure de Python

10

J'ai plusieurs environnements virtuels (des dizaines) sur mon disque créés par le venvmodule de Python 3.6. Maintenant, je suis passé à Ubuntu 19.10 en toute hâte et je n'ai remarqué qu'après que 3.6 n'est pas du tout disponible pour Ubuntu 19.10 à partir des sources généralement reconnues. J'ai réussi à mettre à niveau les versions Python de ces environnements virtuels en les localisant bin/python3sous mon répertoire personnel et en les exécutant python3.7 -mvenv --upgradesur les dossiers contenant.

Maintenant, alors que python3.7 -mvenv --upgradele Python est mis à niveau dans l'environnement virtuel, il ne fait rien pour réinstaller mes versions de package précédentes dans le lib/python3.7/site-packagesdessous venv. Je suppose que j'aurais pu le faire en installant Python 3.6, pip freezeen venvintégrant les exigences de puis en mettant à niveau le venv vers Python 3.7, sipip install -r - si seulement Python 3.6 était disponible pour mon nouveau système d'exploitation.

Existe-t-il un autre moyen de le faire de manière plutôt automatisée (peut-être principalement en pip freezeutilisant l'ancien lib/python3.6répertoire) sans que j'aie à installer Python 3.6 à partir des sources, à l'aide de conda ou à installer 3.6 à partir de certains PPA aléatoires? Je veux mettre à niveau tous les environnements en masse afin qu'à l'avenir, lorsque je devrai faire quelque chose avec un environnement aléatoire, il continuera à fonctionner avec Python 3.7.

Antti Haapala
la source

Réponses:

11

Dans votre nouveau 3.7 venv, vous devriez en disposer pkg_resources- setuptoolsest automatiquement installé lors de sa création. Sinon, juste pip install setuptools.

setuptoolsle code de bibliothèque est en fait ce que pipvend pour faire pip freezefonctionner. Mais vous pouvez simplement le geler manuellement.

# in 3.7 runtime...
import pkg_resources
old_site_dir = ".venv/lib/python3.6/site-packages/"
working_set = pkg_resources.WorkingSet([old_site_dir])
for dist in working_set:
    print(dist.as_requirement())

Vous pouvez lancer cette sortie dans un requirements.txt fichier et avoir probablement un site reconstruit fonctionnel, aucun python3.6runtime requis.

Notez que cette méthode peut ne pas être infaillible à 100%, car il est possible pour les projets de déclarer des arborescences de dépendance distinctes pour python3.6 et python3.7 en utilisant des marqueurs d'environnement dans leurs métadonnées de distribution (voir PEP 508 ). Il est également possible que les éléments installés sur votre site 3.6 ne prennent pas en charge 3.7 du tout . Cependant, il est assez rare de voir que dans une version mineure, bosse entre 3.6 et 3.7, donc l'utilisation du jeu de travail devrait être "assez bonne" en pratique.

wim
la source
"Assez bien" est assez bon dans ce cas. Aucun problème dans la mise à jour du module impair ici et là après que le travail en masse a été fait.
Antti Haapala