Wann wäre die Option -e, --editable bei der Pip-Installation hilfreich?

78

Wann wäre die Option -eoder --editablenützlich pip install?

Bei einigen Projekten lautet die letzte Zeile in der Datei "resources.txt" -e .. Was macht es genau?

raitisd
quelle
6
Verwandte: Python setup.py entwickeln vs installieren ; pip install -eläuft setup.py develop.
Martijn Pieters

Antworten:

75

Wie die Manpage es sagt:

-e,--editable <path/url>
     Install a project in editable mode (i.e.  setuptools "develop mode") from a local project path or a VCS url.

Sie würden dies also verwenden, wenn Sie versuchen, ein Paket lokal zu installieren, meistens, wenn Sie es auf Ihrem System entwickeln. Das Paket wird lediglich mit dem ursprünglichen Speicherort verknüpft, was bedeutet, dass Änderungen am ursprünglichen Paket direkt in Ihrer Umgebung angezeigt werden.

Einige Nuggets hier und hier gleich .

mu 無
quelle
26
Es ist immer noch schwer zu verstehen. Natürlich habe ich die Seite --help gelesen. Aber es hat nicht geholfen. Nehmen wir an, ich habe gerade ein Repo namens 'abc' geklont. Und ich installiere die Anforderungen.txt, die enthält -e .. Wird es ein Paket aus setup.py in Site-Paketen editierbar machen? Entschuldigung, brauche vielleicht ein Beispiel.
Raitisd
9
@ Raituha Hmm Ich denke, die Dokumentation könnte etwas ausführlicher sein
mu 無
Können Sie ein Beispiel geben für: Alle Änderungen am Originalpaket würden sich direkt in Ihrer Umgebung widerspiegeln
Variable
4
@variable: Wenn Sie Ihr lokales Projekt mit -eoption ( pip install -e mypackage) installieren und in Ihrer Umgebung verwenden (z. B. in einem anderen Projekt wie from mypackage import custom_function), können Sie custom_functiondiese aktualisierte Version verwenden, ohne sie erneut zu installieren , wenn Sie Änderungen an Ihrem vornehmen wieder (mit pip installoder python setup.py), was passieren würde, wenn die -eFlagge weggelassen wird.
Nerxis
1
@raitisd: Wenn Sie ausführen pip install -r requirements.txt, werden alle erforderlichen Pakete installiert, und dann (falls vorhanden -e .) sollte das aktuelle Paket im Entwicklungsmodus installiert werden (z. B. befinden Sie sich im mypackageOrdner und es entspricht der Ausführung pip install -e ., sodass sich jede Änderung mypackagedirekt in Ihrer Umgebung widerspiegelt ). Keine anderen Pakete sind davon betroffen.
Nerxis
4

Vom Arbeiten im "Entwicklungs" -Modus :

Obwohl nicht erforderlich, ist es üblich, Ihr Projekt lokal im "bearbeitbaren" oder "Entwicklungs" -Modus zu installieren, während Sie daran arbeiten. Auf diese Weise kann Ihr Projekt sowohl in Projektform installiert als auch bearbeitet werden.

Angenommen, Sie befinden sich im Stammverzeichnis Ihres Projektverzeichnisses, und führen Sie dann Folgendes aus:

pip install -e .

Obwohl etwas kryptisch, -eist die Abkürzung für --editableund .bezieht sich auf das aktuelle Arbeitsverzeichnis. Zusammen bedeutet dies, dass das aktuelle Verzeichnis (dh Ihr Projekt) im bearbeitbaren Modus installiert wird.

Einige zusätzliche Einblicke in die Interna von Setuptools und Distutils aus dem „Entwicklungsmodus“ :

Unter normalen Umständen wird distutilsdavon ausgegangen, dass Sie eine Distribution Ihres Projekts erstellen und nicht in der Form "roh" oder "nicht erstellt" verwenden. Wenn Sie distutilsdiese Methode verwenden würden, müssten Sie Ihr Projekt jedes Mal neu erstellen und installieren, wenn Sie während der Entwicklung Änderungen daran vorgenommen haben.

Ein weiteres Problem, das manchmal auftritt, distutilsbesteht darin, dass Sie möglicherweise zwei verwandte Projekte gleichzeitig entwickeln müssen. Möglicherweise müssen Sie die Pakete beider Projekte im selben Verzeichnis ablegen, um sie auszuführen, sie müssen jedoch zur Revisionskontrolle getrennt bleiben. Wie kannst du das tun?

Mit Setuptools können Sie Ihre Projekte zur Verwendung in einem gemeinsamen Verzeichnis oder Staging-Bereich bereitstellen, ohne jedoch Dateien zu kopieren. Auf diese Weise können Sie den Code jedes Projekts in seinem Checkout-Verzeichnis bearbeiten und müssen nur Build-Befehle ausführen, wenn Sie die C-Erweiterungen eines Projekts oder ähnlich kompilierte Dateien ändern. Sie können ein Projekt sogar im Checkout-Verzeichnis eines anderen Projekts bereitstellen, wenn dies Ihre bevorzugte Arbeitsweise ist (im Gegensatz zur Verwendung eines gemeinsamen unabhängigen Staging-Bereichs oder des Site-Packages-Verzeichnisses).

Verwenden Sie dazu den setup.py developBefehl. Es funktioniert sehr ähnlich wie setup.py install, außer dass es eigentlich nichts installiert. Stattdessen wird .egg-linkim Bereitstellungsverzeichnis eine spezielle Datei erstellt , die mit dem Quellcode Ihres Projekts verknüpft ist. Wenn es sich bei Ihrem Bereitstellungsverzeichnis um das Python- site-packagesVerzeichnis handelt, wird die easy-install.pthDatei auch so aktualisiert , dass sie den Quellcode Ihres Projekts enthält, sodass sie sys.pathfür alle Programme verfügbar ist , die diese Python-Installation verwenden.

Chris Graf
quelle
2

Es ist wichtig zu beachten, dass ein Modul, mit dem installiert wurde , nicht deinstalliert werden pip uninstall kann . Wenn Sie diesen Weg gehen, sollten Sie darauf vorbereitet sein, dass die Dinge sehr chaotisch werden, wenn Sie jemals deinstallieren müssen. Eine Teillösung besteht darin, (1) neu zu installieren, die erstellten Dateien wie in aufzuzeichnen und (2) alle aufgelisteten Dateien manuell zu löschen, wie z. B. (für Release 0.1a2 des Moduls tdc7201). Dies räumt jedoch nicht alles zu 100% auf; Selbst nachdem Sie dies getan haben, kann der Import der (entfernten!) lokalen Bibliothek erfolgreich sein, und der Versuch, dieselbe Version von einem Remote-Server zu installieren, schlägt möglicherweise fehl (da er der Meinung ist, dass Ihre (gelöschte!) lokale Version bereits funktioniert Datum). pip install -esudo python3 -m setup.py install --record installed_files.txtsudo rm -r /usr/local/lib/python3.7/dist-packages/tdc7201-0.1a2-py3.7.egg/

Howard A. Landman
quelle
Interessanter Punkt, also im Wesentlichen mit --editable installieren ist möglicherweise irreversibel? Bedeutet das, dass wir dann einfach die Umwelt verlassen müssen?
information_interchange
4
Es ist zu beachten, dass dies ab den neuesten Versionen von pip nicht mehr der Fall ist. Siehe den folgenden Antwortkommentar zum Stapelüberlauf: stackoverflow.com/questions/17346619/…
root
1

Konkretes Beispiel für die Verwendung --editablein der Entwicklung

Wenn ich mit diesem Testpaket spiele wie in:

cd ~
git clone https://github.com/cirosantilli/vcdvcd
cd vcdvcd
git checkout 5dd4205c37ed0244ecaf443d8106fadb2f9cfbb8
python -m pip install --editable . --user

es gibt aus:

Obtaining file:///home/ciro/bak/git/vcdvcd
Installing collected packages: vcdvcd
  Attempting uninstall: vcdvcd
    Found existing installation: vcdvcd 1.0.6
    Can't uninstall 'vcdvcd'. No files were found to uninstall.
  Running setup.py develop for vcdvcd
Successfully installed vcdvcd-1.0.6

Das Can't uninstall 'vcdvcd'ist normal: Es wurde versucht, vorhandene Dateien zu deinstallieren vcdvcd, um sie dann durch den "Symlink-ähnlichen Mechanismus" zu ersetzen, der in den folgenden Schritten erstellt wird. Dies ist jedoch fehlgeschlagen, da keine vorherigen Installationen vorhanden waren.

Dann wird eine Datei generiert:

~/.local/lib/python3.8/site-packages/vcdvcd.egg-link

was beinhaltet:

/home/ciro/vcdvcd
.

und fungiert als "Symlink" zum Python-Interpreter.

Wenn ich nun Änderungen am Git-Quellcode unter vornehme, werden /home/ciro/vcdvcdautomatisch Importeure angezeigt, die aus jedem Verzeichnis Folgendes tun können:

python -c 'import vcdvcd'

Beachten Sie jedoch, dass pipzumindest in meiner Version mit installierte Binärdateien --editable, wie z. B. das vcdcatvon diesem Paket über scripts=on bereitgestellte Skript setup.py, keine Symlinks erhalten, sondern nur kopiert werden nach:

~/.local/bin/vcdcat

Genau wie bei regulären Installationen wirken sich Aktualisierungen des Git-Repositorys daher nicht direkt auf sie aus.

Zum Vergleich: Eine reguläre --editableNichtinstallation von der Git-Quelle:

python -m pip uninstall vcdvcd
python -m pip install --user .

erstellt eine Kopie der installierten Dateien unter:

~/.local/lib/python3.8/site-packages/vcdvcd

Für die Deinstallation eines bearbeitbaren Pakets wie oben beschrieben ist ein ausreichend neuer Pip erforderlich, wie unter: So deinstallieren Sie bearbeitbare Pakete mit pip (installiert mit -e)

Getestet in Python 3.8, Pip 20.0.2, Ubuntu 20.04.

Empfehlung: Entwickeln Sie, wann immer möglich, direkt im Baum

Das bearbeitbare Setup ist nützlich, wenn Sie Ihren Patch für ein Paket über ein anderes Projekt testen.

Wenn Sie Ihre Änderung jedoch vollständig im Baum testen können, tun Sie dies einfach, anstatt eine bearbeitbare Installation zu generieren, die komplexer ist.

Zum Beispiel ist das obige vcdvcd-Paket so eingerichtet, dass Sie es einfach cdin die Quelle einfügen können , ./vcdcatohne das Paket selbst per Pip installieren zu müssen (im Allgemeinen müssen Sie möglicherweise Abhängigkeiten von installieren requirements.txt) und das import vcdvcd, was diese ausführbare Datei tut (oder möglicherweise Ihre eigener benutzerdefinierter Test) findet das Paket nur korrekt in demselben Verzeichnis, in dem es sich befindet.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle