Frage

Ein weiterer Entwickler und ich andere Meinung darüber, ob PYTHONPATH oder sys.path verwendet werden soll, Python zu erlauben, ein Python-Paket in einem Benutzer zu finden (zum Beispiel Entwicklung) Verzeichnis.

Wir haben ein Python-Projekt mit einer typischen Verzeichnisstruktur:

Project
    setup.py
    package
        __init__.py
        lib.py
        script.py

In script.py, müssen wir import package.lib tun. Wenn das Paket in Website-Paketen installiert ist, kann script.py package.lib finden.

Wenn Sie von einem Benutzerverzeichnis arbeiten, aber etwas anderes getan werden muss. Meine Lösung ist mein PYTHONPATH um „~ / Project“ zu setzen. Ein anderer Entwickler möchte diese Codezeile am Anfang script.py setzen:

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

Damit Python kann die lokale Kopie von package.lib finden.

Ich denke, das ist eine schlechte Idee, da diese Linie nur für Entwickler oder Menschen ist von einer lokalen Kopie ausgeführt wird, aber ich kann einen guten Grund nicht, warum es eine schlechte Idee ist.

Sollten wir PYTOHNPATH, sys.path, oder ist entweder in Ordnung?

War es hilfreich?

Lösung

Wenn der einzige Grund, den Pfad zu ändern für Entwickler von ihrem Arbeits Baum arbeiten, dann sollten Sie ein Installations-Tool verwenden, um Ihre Umgebung für Sie einzurichten. virtualenv ist sehr beliebt, und wenn Sie Setuptools verwenden, können Sie einfach setup.py develop halb installiert Arbeits Baum in der aktuellen Python-Installation ausgeführt werden.

Andere Tipps

I PYTHONPATH hassen. Ich finde es spröde und ärgerlich setzen auf eine Benutzerbasis (insbesondere für Daemon-Benutzer) und zu verfolgen, wie Projektordner bewegen. Ich würde viel lieber sys.path in dem invoke Skripte für eigenständige Projekte festgelegt.

Allerdings sys.path.append ist nicht der richtige Weg, es zu tun. Sie können Duplikate leicht zu bekommen, und es nicht .pth Dateien aussortieren. Besser (und besser lesbar.): site.addsitedir

Und script.py würde nicht normalerweise die geeignetere Stelle, es zu tun, wie es ist innen das Paket, das Sie wollen auf dem Weg zur Verfügung zu stellen. Bibliotheksmodule sollte auf jeden Fall selbst berührt nicht sys.path. Stattdessen würden Sie normalerweise einen hashbanged-Skript außerhalb des Pakets, das Sie die App verwenden, um zu instanziiert und laufen, und es ist in diesem trivialen Wrapper-Skript würden Sie Bereitstellungsdetails wie sys.path-frobbing setzen.

Generell würde ich halte eine Umgebungsvariablen Einrichtung (wie PYTHONPATH) eine schlechte Praxis zu sein. Während dies für eine einmalige Debuggen in Ordnung sein, aber mit diesem als
eine regelmäßige Praxis möglicherweise keine gute Idee sein.

Die Verwendung von Umgebungsvariablen führt zu Situationen, wie „es funktioniert für mich“, wenn jemand
Berichte andere Probleme in der Code-Basis. Auch könnte man die gleiche Praxis mit der Durchführung Testumgebung als auch auf Situationen wie die Tests führen für eine laufende Fein insbesondere Entwickler, aber wahrscheinlich versagt, wenn jemand die Tests gestartet wird.

Neben den vielen anderen Gründen bereits erwähnt, können Sie auch outh hinweisen, dass Hartcodierung

sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

ist spröde, weil es die Lage von script.py vermutet - es wird nur funktionieren, wenn script.py in Project / Paket befindet. Es wird brechen, wenn ein Benutzer zu bewegen entscheidet / copy / Symlink script.py (fast) überall sonst.

Ich glaube, dass in diesem Fall mit PYTHONPATH ist eine bessere Sache, vor allem, weil es nicht (fraglich) unnötigen Code einführt.

Nach allem, wenn Sie daran denken, Ihre Benutzer müssen nicht, dass sys.path Sache, weil Ihr Paket in Website-Pakete installiert werden erhalten, weil Sie ein Verpackungssystem wird verwendet.

Wenn der Benutzer von einer „lokalen Kopie“ laufen wählt, wie Sie es nennen, dann habe ich festgestellt, dass die übliche Praxis Zustand ist, dass das Paket manuell zu PYTHONPATH hinzugefügt werden muss, wenn sie außerhalb der verwendeten Website-Pakete.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top