Wanneer zou de -e, –editable optie nuttig zijn bij pip install?

Wanneer zou de optie -eof --editablenuttig zijn bij pip install?

Voor sommige projecten is de laatste regel in requirements.txt -e .. Wat doet het precies?


Antwoord 1, autoriteit 100%

Zoals de man-pagina het zegt:

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

Dus u zou dit gebruiken wanneer u een pakket lokaal probeert te installeren, meestal wanneer u het op uw systeem ontwikkelt. Het koppelt het pakket gewoon aan de oorspronkelijke locatie, wat in feite betekent dat eventuele wijzigingen aan het oorspronkelijke pakket rechtstreeks in uw omgeving worden doorgevoerd.

Enkele goudklompjes rond dezelfde hieren hier.

Een voorbeeld van een run kan zijn:

pip install -e .

of

pip install -e ~/ultimate-utils/ultimate-utils-proj-src/

merk op dat de tweede het volledige pad is naar waar de setup.pyzou zijn.


Antwoord 2, autoriteit 20%

Concreet voorbeeld van het gebruik van --editablein ontwikkeling

Als je speelt met dit testpakketzoals in:

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

het geeft het volgende weer:

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

De Can't uninstall 'vcdvcd'is normaal: het probeerde alle bestaande vcdvcdte verwijderen om ze vervolgens te vervangen door het “symlink-achtige mechanisme” dat wordt geproduceerd in de volgende stappen, maar is mislukt omdat er geen eerdere installaties waren.

Vervolgens genereert het een bestand:

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

die bevat:

/home/ciro/vcdvcd
.

en fungeert als een “symlink” naar de Python-interpreter.

Dus als ik nu wijzigingen aanbreng in de git-broncode onder /home/ciro/vcdvcd, wordt dit automatisch doorgevoerd voor importeurs die vanuit elke map het volgende kunnen doen:

python -c 'import vcdvcd'

Houd er echter rekening mee dat in mijn pip-versie ten minste binaire bestanden zijn geïnstalleerd met --editable, zoals het vcdcat-script dat daardoor wordt geleverd pakket via scripts=op setup.py, krijg geen symlink, gewoon gekopieerd naar:

~/.local/bin/vcdcat

net als bij reguliere installaties, en daarom hebben updates van de git-repository geen directe invloed op hen.

Ter vergelijking: een gewone niet --editableinstallatie van de git-bron:

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

maakt een kopie van de geïnstalleerde bestanden onder:

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

Het verwijderen van een bewerkbaar pakket zoals hierboven gedaan vereist een nieuw genoeg pip zoals vermeld op: Bewerkbare pakketten verwijderen met pip (geïnstalleerd met -e)

Getest in Python 3.8, pip 20.0.2, Ubuntu 20.04.

Aanbeveling: ontwikkel waar mogelijk direct in-tree

De bewerkbare setup is handig wanneer u uw patch naar een pakket test via een ander project.

Als u uw wijziging echter volledig in-tree kunt testen, doe dat dan gewoon in plaats van een bewerkbare installatie te genereren die ingewikkelder is.

Bijvoorbeeld, het vcdvcd-pakket hierboven is zo ingesteld dat u gewoon cdin de broncode kunt plaatsen en ./vcdcatkunt doen zonder pip het pakket zelf te installeren (in het algemeen , moet u mogelijk afhankelijkheden van requirements.txtinstalleren, en de import vcdvcddie dat uitvoerbare bestand doet (of mogelijk uw eigen aangepaste test) vindt het pakket gewoon correct in dezelfde map waarin het zich bevindt.


Antwoord 3, autoriteit 5%

Van Werken in de “ontwikkelings”-modus :

Hoewel niet vereist, is het gebruikelijk om uw project lokaal te installeren in
“bewerkbare” of “ontwikkel”-modus terwijl u eraan werkt. Dit maakt het mogelijk
om uw project zowel in projectvorm te installeren als te bewerken.

Ervan uitgaande dat u zich in de hoofdmap van uw projectdirectory bevindt, voer dan het volgende uit:

pip install -e .

Hoewel enigszins cryptisch, is -eeen afkorting voor
--editable, en .verwijst naar de huidige werkdirectory, dus samen betekent het dat u de huidige directory moet installeren (d.w.z. uw
project) in bewerkbare modus.

Enkele aanvullende inzichten in de interne onderdelen van setuptools en distutils van ‘Ontwikkelingsmodus’:

Onder normale omstandigheden gaan de distutilservan uit dat u
bouw een distributie van uw project, gebruik het niet in zijn “onbewerkte” of
“onbebouwde” vorm. Als u de distutilsop die manier zou gebruiken, zou u:
moet uw project opnieuw opbouwen en opnieuw installeren elke keer dat u een
verander het tijdens de ontwikkeling.

Een ander probleem dat soms met de distutilskomt, is dat u
moet mogelijk tegelijkertijd twee gerelateerde projecten ontwikkelen.
Mogelijk moet u de pakketten van beide projecten in dezelfde map plaatsen om
voer ze uit, maar moet ze apart houden voor revisiecontrole
doeleinden. Hoe kun je dit doen?

Met Setuptools kunt u uw projecten implementeren voor gebruik in een gemeenschappelijke
directory of staging-gebied, maar zonder bestanden te kopiëren. Dus jij
kan de code van elk project in de checkout-directory bewerken en hoeft alleen
om build-commando’s uit te voeren wanneer u de C-extensies van een project wijzigt of
vergelijkbare gecompileerde bestanden. Je kunt zelfs een project in een ander project implementeren
de kassa-directory van het project, als dat uw favoriete manier van werken is
(in tegenstelling tot het gebruik van een gemeenschappelijke onafhankelijke verzamelplaats of de
site-packages directory).

Gebruik hiervoor de opdracht setup.py develop. Het werkt ongeveer hetzelfde
naar setup.py install, behalve dat het eigenlijk niets installeert.
In plaats daarvan maakt het een speciaal .egg-link-bestand in de implementatie
directory, die linkt naar de broncode van uw project. En, als je
deployment directory is de site-packagesdirectory van Python, het zal ook:
update het bestand easy-install.pthom de bron van uw project op te nemen
code, waardoor het beschikbaar is op sys.pathvoor alle programma’s die . gebruiken
die Python-installatie.


Antwoord 4, autoriteit 4%

Het is belangrijk op te merken dat pip uninstallkannietdeïnstallereneen module die is geïnstalleerd met pip install -e. Dus als je deze route volgt, wees dan voorbereid op dingen die erg rommelig kunnen worden als je ooit de installatie ongedaan moet maken. Een gedeeltelijkeoplossing is om (1) opnieuw te installeren, de gemaakte bestanden bij te houden, zoals in sudo python3 -m setup.py install --record installed_files.txt, en dan (2) verwijder handmatig alle bestanden in de lijst, zoals in bijv sudo rm -r /usr/local/lib/python3.7/dist-packages/tdc7201-0.1a2-py3.7.egg/(voor release 0.1a2 van module tdc7201). Dit ruimt echter niet 100% alles op; zelfs nadat je het hebt gedaan, kan het importeren van de (verwijderde!) lokale bibliotheek slagen, en een poging om dezelfde versie vanaf een externe server te installeren, kan niets opleveren (omdat het denkt dat je (verwijderde!) lokale versie al aan datum).


Antwoord 5

Zoals gesuggereerd in eerdere antwoorden, worden er geen symbolische links gemaakt.
Hoe werkt de ‘-e’ optie? -> Het werkt gewoon het bestand “PYTHONDIR/site-packages/easy-install.pth” bij met het projectpad gespecificeerd in het ‘commando pip install -e’.
Dus elke keer dat python naar een pakket zoekt, zal het deze map ook controleren => alle wijzigingen aan de bestanden in deze map worden onmiddellijk weergegeven.

Other episodes