Wie ein virtualenv aktuell halten?

Probleme bei der Installation?
Antworten
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Frage mich gerade wie man am einfachsten ein erstelltes virtualenv up-to-date hält?

Es gibt natürlich pip install --upgrade SomePackage aber nicht sowas, wie ein apt-get dist-upgrade
Also etwas was jedes installierte Paket aktualisiert und gleich die --editable dazu...

Oder hab ich was übersehen?

In PyLucid liefer ich zwar eine fast_update.py script mit, um die editables zu updaten, aber das ist nicht so schön: https://github.com/jedie/PyLucid/blob/m ... _update.py
Im Grunde wird ein git pull origin bzw. svn update für alle editables in /src/ gemacht. Allerdings wird dabei z.b. die Versionnummer nicht angepasst.

Wie kann man also ein virtualenv am einfachsten aktuell halten?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

@jens: So ohne weiteres kann man die in einem virtualenv installierten Pakete nicht aktuell halten, schon weil man per se nicht einfach zwischen Pakete innerhalb und außerhalb der Umgebung unterscheiden kann. Deswegen reicht es nicht, mithilfe der setuptools-API über alle installierten "Distribution"s zu iterieren.

Meine Empfehlung wäre einfach, alle Abhängigkeiten in einer "requirements"-Datei zusammenzufassen. Dann reicht zur Aktualisierung ein periodisches "pip install -U -r requirements.txt".

Das schließt natürlich "editables" aus (ich nehme an, dass Du damit "pip install -e" meinst). Wie man die „aktualisieren“ sollte, erschließt sich mir allerdings nicht so ganz. Solche Pakete sind ja immer aktuell, dass ist ja gerade der Sinn von "-e".
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

lunar hat geschrieben:Solche Pakete sind ja immer aktuell, dass ist ja gerade der Sinn von "-e".
Wieso das? Läuft bei dir ein Deamon der die git/svn repos aktualisiert ;)

Aber das Stichwort mit der requirements.txt Datei ist ganz gut. Hatte mir auch schon mal überlegt so eine Datei anzulegen...

z.Z. liegen die "requirements"-Daten in einem virtualenv bootstrap script: https://github.com/jedie/PyLucid-boot/b ... id-boot.py

Das ist aus dem Grunde, weil man bei meinem bootstrap script wählen kann, wie die editables ("pip install -e") installieren sollen:
  • * über SVN (github svn gateway)
    * über git readonly clone
    * über git mit push access
Ist es nicht auch so, das man in einer "requirements"-Daten auch die "editables" einfügen kann?

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Ein andere Idee: Kann man in einem bestehenden virtualenv nicht eine Liste der mit pip installieren Dinge herraus bekommen?

Das wäre nett, dann könnte man mit einem allgemeinen Skript ein update ausführen. Noch netter wäre es, wenn pip das direkt kann... Also ein "pip install -U" ohne das man ein "-r requirements.txt" anhängen müßte...

EDIT: Ah, wird schon schon dran gearbeitet: https://github.com/pypa/pip/issues/59 bzw.: https://bitbucket.org/khightower/pip/sr ... upgrade.py

EDIT2: pip freeze --local macht schon mal was in die richtige Richtung... Man erhält eine Liste aller installierten Pakete im virtualenv... Auch die editables, mit url...

Dieses upgrade.py Skript, spukt bei meinem Tests alle Pakete die installiert sind, also auch die globalen (so wie eine freeze ohne --local)

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab ein fork von pip gemacht und ein "Upgrade all local installed packages" gemacht:

https://github.com/jedie/pip/commit/7a3 ... 7ccf420dd5
bzw.:
https://github.com/pypa/pip/pull/313

ich glaube ich bastle noch ein standalone skript, was man direkt nutzten kann, bis es im offiziellen pip angekommen ist...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
lunar

jens hat geschrieben:
lunar hat geschrieben:Solche Pakete sind ja immer aktuell, dass ist ja gerade der Sinn von "-e".
Wieso das? Läuft bei dir ein Deamon der die git/svn repos aktualisiert ;)
Nein, mir ist nur der Unterschied zwischen Paketverwaltung und Versionskontrolle bewusst ;)
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

So... Hab in django-tools das Skript upgrade_virtualenv.py

Das ruft im Grunde nur pip install --upgrade mit allen lokal im virtualenv installieren Paketen und editables...

Mehr Informationen: http://www.pylucid.org/de/blog/221/scri ... irtualenv/


Doch bei den editables macht pip eigentlich:

Code: Alles auswählen

git fetch -q
git checkout -q -f master
Wenn ich aber danach nochmal ein git pull origin master mache, sehe ich das erst dann Änderungen eingespielt werden... Warum?


EDIT: Es soll wohl an einer zu alten Version von pip liegen...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Mein Skript funktioniert dennoch nicht richtig... Denn die Informationen die hier raus kommen, sind falsch:

Code: Alles auswählen

    for dist in get_installed_distributions(local_only=True):
        req = pip.FrozenRequirement.from_dist(dist, dependency_links=dependency_links)

        if not req.editable:
            packages.append(req.name)
Normalerweise sollten die "-e" pakete == req.editable == true sein... Ist es aber komischerweise nicht... bzw. nicht immer.

Obwohl pip freeze --local immer das richtige Anzeigt.

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Hab dazu mal https://github.com/pypa/pip/issues/319 eröffnet...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Also in PyLucid bin ich doch wieder weg, vom "Automatischen" Update...

Nun nutzte ich wieder normale "pip requirements files".

Diese Dateien nutzte ich an mehreren Stellen, z.B. beim erzeugen des bootstrap skriptes oder in der setup.py

Ich hab auch ein eigenes kleines CLI Skript zum updaten gemacht.

Der Vorteil: Mann kann bequem ein, mehrere oder alle Pakete per "pip install --upgrade" behandeln:
Which package should be upgraded?

(0) feedparser>=5.0.1,<5.1
(1) Pygments>=1.4,<1.5
(2) django-reversion>=1.4,<1.5
(3) django-dbtemplates>=1.1.1,<1.2
(4) django-tagging>=0.3.1,<0.4
(5) South>=0.7.3,<0.8
(6) Django>=1.3,<1.4
(7) python-creole==0.6
(8) django-dbpreferences>=0.4.2,<0.5
(9) django-tools>=0.18.1,<0.19
(10) --editable=git+git://github.com/jedie/PyLucid.git#egg=pylucid
(a) upgrade all packages

Please select (one entry or comma seperated):
Die Informationen dazu kommen auch aus den zentralen requirements files ;)

(Siehe auch http://www.pylucid.org/permalink/141/bl ... irtualenv/ )

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten