Frage Warum sys.path.append (Pfad) anstelle von sys.path.insert (1, Pfad) verwenden?


Bearbeiten: basierend auf einem Kommentar von Ulf Rompe, Es ist wichtig, dass Sie "1" anstelle von "0" verwendensonst wirst du brechen Systempfad.

Ich mache jetzt schon eine ganze Weile Python (über ein Jahr), und ich bin immer verwirrt, warum Leute dich empfehlen sys.path.append() Anstatt von sys.path.insert(). Lass mich demonstrieren.

Nehmen wir an, ich arbeite an einem Modul namens PyWorkbooks (das auf meinem Computer installiert ist), arbeite aber gleichzeitig an einem anderen Modul (sagen wir PyJob), das PyWorkbooks enthält. Während ich an PyJob arbeite, finde ich Fehler in PyWorkbooks, die ich korrigiere, daher möchte ich eine Entwicklungsversion importieren.

Es gibt mehrere Möglichkeiten, an beiden zu arbeiten (ich könnte mein PyWorkbooks-Projekt zum Beispiel in PyJob einfügen), aber manchmal muss ich trotzdem mit dem Pfad spielen. Jedoch, Ich kann nicht einfach tun sys.path.append() zu dem Ordner, in dem PyWorkbooks ist. Warum? Weil Python zuerst meine installierten PyWorkbooks findet!

Deshalb müssen Sie eine sys.path.insert (1, path_to_dev_pyworkbooks) machen

Zusammenfassend:

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

oder:

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

Das hat mir in der Vergangenheit einige Probleme bereitet, und ich würde es wirklich gerne haben, wenn wir (als eine Community) anfangen würden zu empfehlen sys.path.insert(1, path), als würden Sie manuell einen Pfad einfügen Ich denke, es ist sicher zu sagen, dass dies der Pfad ist, den Sie verwenden möchten!

Oder habe ich etwas falsch? Es ist eine Frage, die mich manchmal stört und ich wollte sie offen!


76
2018-04-10 19:19


Ursprung


Antworten:


Wenn Sie mehrere Versionen eines Pakets / Moduls haben, müssen Sie es verwenden virtualenv (Hervorhebung von mir):

virtualenv ist ein Tool zum Erstellen isolierter Python-Umgebungen.

Das grundlegende Problem, das angesprochen wird, ist eine der Abhängigkeiten und Versionen und indirekt die Berechtigungen. Stellen Sie sich vor, Sie haben eine Anwendung, die Version 1 von LibFoo benötigt, aber eine andere Anwendung benötigt Version 2. Wie können Sie beide Anwendungen verwenden? Wenn Sie alles installieren /usr/lib/python2.7/site-packages (oder wie auch immer der Standardstandort Ihrer Plattform lautet), es ist leicht, in einer Situation zu landen, in der Sie unbeabsichtigt eine Anwendung aktualisieren, die nicht aktualisiert werden sollte.

Oder allgemeiner gesagt, was ist, wenn Sie eine Anwendung installieren und lassen Sie es sein? Wenn eine Anwendung funktioniert, können Änderungen an ihren Bibliotheken oder den Versionen dieser Bibliotheken die Anwendung beschädigen.

Was auch, wenn Sie Pakete nicht in den globalen installieren können site-packages Verzeichnis? Zum Beispiel auf einem freigegebenen Host.

In all diesen Fällen virtualenv kann dir helfen. Es erstellt eine Umgebung mit eigenen Installationsverzeichnissen, die keine Bibliotheken mit anderen virtualenv-Umgebungen teilen (und optional auch nicht auf die global installierten Bibliotheken zugreifen).

Deshalb denken Leute darüber nach insert(0, falsch liegen - es ist eine unvollständige Lösung für das Problem der Verwaltung mehrerer Umgebungen.


41
2018-04-10 19:23



Wenn Sie wirklich sys.path.insert verwenden müssen, sollten Sie sys.path [0] so lassen, wie es ist:

sys.path.insert(1, path_to_dev_pyworkbooks)

Dies könnte wichtig sein, da sich der Code von Drittanbietern darauf verlassen kann sys.path-Dokumentation Konformität:

Wie beim Programmstart initialisiert, ist der erste Eintrag dieser Liste   Pfad [0], ist das Verzeichnis, das das verwendete Skript enthält   Rufen Sie den Python-Interpreter auf.


40
2018-04-10 22:47



Sie verwirren das Konzept des Anhängens und Voranbringens. Der folgende Code ist in Vorbereitung:

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

es stellt die neue Information am Anfang (gut, Sekunde, um genau zu sein) der Suchreihenfolge, die Ihr Dolmetscher durchlaufen wird. sys.path.append() bringt die Dinge ans Ende der Suchsequenz.

Es ist ratsam, dass Sie etwas wie virtualenv Anstatt Ihre Paketverzeichnisse manuell in die PYTHONPATH jedes Mal. für die Einrichtung verschiedener Ökosysteme, die Ihre Site-Pakete und mögliche Versionen von Python trennen, lesen Sie diese beiden Blogs:

  1. Einführung von Python-Ökosystemen

  2. Bootstrapping von virtuellen Python-Umgebungen

Wenn Sie sich entscheiden, den Pfad zur Umgebungsisolation zu verlassen, würden Sie sicherlich davon profitieren, in virtualenvwrapper zu schauen: http://www.doughellmann.com/docs/virtualenvwrapper/


12
2018-06-24 18:01