Waarom sys.path.append(path) gebruiken in plaats van sys.path.insert(1, path)?

Bewerken:gebaseerd op de opmerking van Ulf Rompe, het is belangrijk dat je “1” gebruikt in plaats van “0”, anders verbreek je sys.path.

Ik gebruik python nu al een tijdje (meer dan een jaar), en ik weet altijd niet waarom mensen je aanraden om sys.path.append()te gebruiken in plaats van sys.path.insert(). Laat me het demonstreren.

Stel dat ik aan een module met de naam PyWorkbooks werk (die op mijn computer is geïnstalleerd), maar ik werk tegelijkertijd aan een andere module (laten we zeggen PyJob) die PyWorkbooks bevat. Terwijl ik aan PyJob werk, vind ik fouten in PyWorkbooks die ik corrigeer, dus ik wil graag een ontwikkelingsversie importeren.

Er zijn meerdere manieren om aan beide te werken (ik zou bijvoorbeeld mijn PyWorkbooks-project in PyJob kunnen plaatsen), maar soms moet ik nog steeds met het pad spelen. Ik kan echter niet zomaar een sys.path.append()doen naar de map waar PyWorkbooks zich bevindt. Waarom? Omdat python mijn geïnstalleerde PyWorkbooks als eerste zal vinden!

Dit is waarom je een sys.path.insert(1, path_to_dev_pyworkbooks)

moet doen

Samengevat:

sys.path.append(path_to_dev_pyworkbooks)
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one

of:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0**
import PyWorkbooks # imports correct file

Dit heeft me in het verleden een paar keer vastgelopen, en ik zou het erg op prijs stellen als we (als gemeenschap) sys.path.insert(1, path)gaan aanbevelen, alsof je voegt handmatig een pad in. Ik denk dat het veilig is om te zeggen dat dit het pad is dat je wilt gebruiken!

Of heb ik iets mis? Het is een vraag die me soms dwarszit en ik wilde het in de openbaarheid brengen!


Antwoord 1, autoriteit 100%

Als je sys.path.insert echt moet gebruiken, overweeg dan om sys.path[0] te laten zoals het is:

sys.path.insert(1, path_to_dev_pyworkbooks)

Dit kan belangrijk zijn omdat code van derden mogelijk afhankelijk is van sys.path documentatieconformiteit:

Zoals geïnitialiseerd bij het opstarten van het programma, is het eerste item van deze lijst,
path[0], is de map met het script dat werd gebruikt om
de Python-interpreter aanroepen.


Antwoord 2, autoriteit 96%

Als je meerdere versies van een pakket / module hebt, moet je virtualenv(nadruk van mij):

virtualenvis een tool om geïsoleerde Python-omgevingen te creëren.

Het fundamentele probleem dat wordt aangepakt, is er een van afhankelijkheden en versies, en indirect permissies. Stel je voor dat je een applicatie hebt die versie 1 van LibFoo nodig heeft, maar een andere applicatie vereist versie 2. Hoe kun je beide applicaties gebruiken?Als je alles installeert in /usr/lib/python2.7/site-packages(of wat de standaardlocatie van uw platform ook is), het is gemakkelijk om in een situatie te komen waarin u onbedoeld een applicatie upgradet die niet geüpgraded zou moeten worden.

Of meer in het algemeen, wat als u een applicatie wilt installeren en laat staan? Als een applicatie werkt, kan elke wijziging in de bibliotheken of de versies van die bibliotheken de applicatie kapot maken.

En wat als u geen pakketten kunt installeren in de globale site-packagesdirectory? Bijvoorbeeld op een gedeelde host.

In al deze gevallen kan virtualenvje helpen. Het creëert een omgeving die zijn eigen installatiemappen heeft, die geen bibliotheken deelt met andere virtualenv-omgevingen (en optioneel ook geen toegang heeft tot de wereldwijd geïnstalleerde bibliotheken).

Daarom beschouwen mensen insert(0, >als fout — het is een onvolledige, tijdelijke oplossing voor het probleem van het beheren van meerdere omgevingen.


Antwoord 3, autoriteit 26%

je verwart het concept van toevoegen en toevoegen. de volgende code gaat vooraf:

sys.path.insert(1,'/thePathToYourFolder/')

het plaatst de nieuwe informatie aan het begin (nou ja, ten tweede, om precies te zijn) van de zoekreeks die uw tolk zal doorlopen. sys.path.append()plaatst dingen helemaal aan het einde van de zoekreeks.

het is aan te raden dat je iets als virtualenvgebruikt in plaats van je pakketdirectory’s elke keer handmatig in het PYTHONPATHte coderen. voor het opzetten van verschillende ecosystemen die uw site-pakketten en mogelijke versies van python scheiden, lees deze twee blogs:

  1. introductie van python-ecosystemen

  2. het bootstrappen van virtuele python-omgevingen

als je besluit om het pad naar omgevingsisolatie in te slaan, zou je zeker baat hebben bij virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/

Other episodes