Bearbeiten: Basierend auf dem Kommentar eines Ulf Rompe ist es wichtig, dass Sie "1" anstelle von "0" verwenden , da Sie sonst sys.path unterbrechen .
Ich mache jetzt schon eine ganze Weile (über ein Jahr) Python und bin immer verwirrt darüber, warum die Leute empfehlen, dass Sie sys.path.append()
statt verwenden sys.path.insert()
. Lassen Sie mich demonstrieren.
Angenommen, ich arbeite an einem Modul namens PyWorkbooks (das auf meinem Computer installiert ist), 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 beispielsweise in PyJob einfügen), aber manchmal muss ich trotzdem mit dem Pfad spielen. Allerdings kann ich nicht einfach tun , sys.path.append()
um den Ordner , in dem PyWorkbooks an ist . Warum? Weil Python zuerst meine installierten PyWorkbooks findet!
Aus diesem Grund müssen Sie einen sys.path.insert (1, path_to_dev_pyworkbooks) ausführen.
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
Dies hat in der Vergangenheit einige Probleme für mich verursacht, und ich würde es wirklich begrüßen, wenn wir (als Community) anfangen würden zu empfehlen sys.path.insert(1, path)
, als ob Sie manuell einen Pfad einfügen. Ich denke, es ist sicher zu sagen, dass dies der gewünschte Pfad ist benutzen!
Oder habe ich etwas falsch? Es ist eine Frage, die mich manchmal stört und die ich offen haben wollte!
quelle
sys.path.insert(1, dev_folder)
aber es findet immer noch nicht das Dev-Modul und verwendet nur das installierte Modul. Wie behebe ich das?Antworten:
Wenn Sie mehrere Versionen eines Pakets / Moduls haben, müssen Sie virtualenv (Schwerpunkt Mine) verwenden:
Aus diesem Grund halten die Leute
insert(0,
es für falsch - es ist eine unvollständige Notlösung für das Problem der Verwaltung mehrerer Umgebungen.quelle
virtualenv
und suche tatsächlich nach der zugehörigen Antwort auf das OP)venv
.Wenn Sie sys.path.insert wirklich verwenden müssen, sollten Sie sys.path [0] unverändert lassen:
Dies kann wichtig sein, da Code von Drittanbietern möglicherweise von der Konformität der sys.path-Dokumentation abhängt :
quelle
Sie verwirren das Konzept des Anhängens und Voranstellens. Der folgende Code steht vor:
Es platziert die neuen Informationen am Anfang (genauer gesagt an zweiter Stelle) der Suchsequenz, die Ihr Dolmetscher durchlaufen wird.
sys.path.append()
setzt die Dinge ganz am Ende der Suchsequenz.Es ist ratsam, dass Sie so etwas wie verwenden,
virtualenv
anstatt Ihre PaketverzeichnissePYTHONPATH
jedes Mal manuell in das zu codieren. Lesen Sie diese beiden Blogs, um verschiedene Ökosysteme einzurichten, die Ihre Site-Pakete und mögliche Versionen von Python trennen:Einführung in Python-Ökosysteme
Bootstrapping von virtuellen Python-Umgebungen
Wenn Sie sich für den Weg zur Isolation der Umgebung entscheiden, profitieren Sie sicherlich von einem Blick auf virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/
quelle