Installieren Sie Pakete nach dem Upgrade der Python-Hauptversion automatisch in der virtuellen Umgebung neu

10

Ich habe mehrere virtuelle Umgebungen (Dutzende) auf meiner Festplatte, die vom venvModul von Python 3.6 erstellt wurden. Jetzt habe ich in Eile ein Upgrade auf Ubuntu 19.10 durchgeführt und erst danach festgestellt, dass 3.6 für Ubuntu 19.10 aus den allgemein anerkannten Quellen überhaupt nicht verfügbar ist. Ich habe es geschafft, die Python-Versionen dieser virtuellen Umgebungen zu aktualisieren, indem bin/python3ich sie in meinem Ausgangsverzeichnis gefunden und in python3.7 -mvenv --upgradeden enthaltenen Ordnern ausgeführt habe.

Jetzt, während python3.7 -mvenv --upgradeUpgrades des Python in der virtuellen Umgebung, macht es gar nichts zu meinen vorherigen Paketversionen in der Neuinstallation lib/python3.7/site-packagesunter dem venv. Ich denke, ich hätte dies tun können, indem ich Python 3.6 installiert, pip freezedie Anforderungen von venvund dann das Venv auf Python 3.7 aktualisiert hätte pip install -r- wenn nur Python 3.6 für mein neues Betriebssystem installiert gewesen wäre.

Gibt es eine andere Möglichkeit, dies eher automatisiert zu tun (möglicherweise hauptsächlich unter pip freezeVerwendung des alten lib/python3.6Verzeichnisses), ohne dass ich Python 3.6 von der Quelle, Conda oder 3.6 von zufälligen PPAs installieren muss? Ich möchte alle Umgebungen massenhaft aktualisieren, damit ich in Zukunft, wenn ich etwas mit einer zufälligen Umgebung tun muss, weiterhin mit Python 3.7 arbeiten kann.

Antti Haapala
quelle

Antworten:

11

In Ihrem neuen 3.7-Venv sollten Sie pkg_resourcesverfügbar sein - setuptoolswird beim Erstellen automatisch installiert. Wenn nicht, einfach pip install setuptools.

setuptoolsBibliothekscode ist eigentlich das, was pipVendoring ist, um pip freezeArbeit zu machen . Sie können es jedoch einfach manuell einfrieren.

# 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())

Sie können diese Ausgabe in eine requirements.txtDatei werfen und haben wahrscheinlich eine funktionierende rekonstruierte Site, ohne dass eine python3.6Laufzeit erforderlich ist.

Beachten Sie, dass diese Methode möglicherweise nicht 100% narrensicher ist, da Projekte separate Abhängigkeitsbäume für Python3.6 und Python3.7 deklarieren können, indem Umgebungsmarkierungen in ihren Verteilungsmetadaten verwendet werden (siehe PEP 508 ). Es ist auch möglich , dass in Ihrer 3.6 Website installierten Artikel nicht 3.7 unterstützen überhaupt . Es ist jedoch ziemlich ungewöhnlich, dass in einer kleinen Version eine Beule zwischen 3.6 und 3.7 auftritt, sodass die Verwendung des Arbeitssatzes in der Praxis "gut genug" sein sollte.

wim
quelle
"Gut genug" ist in diesem Fall gut genug. Kein Problem beim Aktualisieren des ungeraden Moduls hier und da, nachdem die Massenarbeit erledigt wurde.
Antti Haapala