Bereitstellen einer Python-Anwendung mit Shared-Paket
-
11-07-2019 - |
Frage
Ich denke, wie eine entfaltete Python-Anwendung anzuordnen, die eine
haben- Executable Skript befindet sich im Verzeichnis / usr / bin /, die eine CLI-Funktionalität in implementiert liefert
- Eine Bibliothek installiert, wo die aktuelle Website-Pakete Verzeichnis ist.
Nun, zur Zeit, ich habe die folgende Verzeichnisstruktur in meinen Quellen:
foo.py
foo/
__init__.py
...
was ich denke, ist nicht der beste Weg, Dinge zu tun. Während der Entwicklung funktioniert alles wie erwartet jedoch, wenn im Einsatz, das „von foo import FooObject“ Code in foo.py versucht scheinbar foo.py selbst zu importieren, die nicht das Verhalten, die ich suche.
Die Frage ist also, was ist die gängige Praxis von Situationen wie diese zu orchestrieren? Eines der Dinge, die ich ist denken konnte, bei der Installation, foo.py nur foo umbenennen, die sie sich von den Import stoppt, aber das scheint eher umständlich ...
Ein weiterer Teil des Problems, nehme ich an, dass es sich um eine Name Herausforderung ist. Vielleicht rufen Sie die ausführbare Skript foo-bin.py?
Lösung
dieser Artikel ist ziemlich gut, und zeigt Ihnen einen guten Weg, es zu tun. Der zweite Punkt von der Do Liste beantwortet Ihre Frage.
schamlos kopieren und einfügen:
Dateisystem-Struktur eines Python-Projekt
von Jp Calderone
:
- benennen das Verzeichnis etwas zu Ihrem Projekt. Zum Beispiel, wenn Ihr Projekt „Twisted“ genannt, nennen die Top-Level-Verzeichnis für seine Quelle Dateien
Twisted
. Wenn Sie das tun Mitteilungen, Sie sollten eine Versionsnummer enthalten Suffix:.Twisted-2.5
- ein Verzeichnis
Twisted/bin
erstellen und ausführbare Dateien dort setzen, wenn Sie welche haben. Geben sie nicht eine.py
Erweiterung, auch wenn sie Python Quelldaten. Stellen Sie keinen Code in sie außer einem Import von und Aufruf an ein Hauptfunktion irgendwo anders definiert in Ihren Projekten.- Wenn Ihr Projekt ist ausdrückbar als eine einzelne Python-Quelldatei, legt es dann in das Verzeichnis und Namen etwas zu Ihrem Projekt. Zum Beispiel
Twisted/twisted.py
. Wenn du müssen mehrere Quelldateien, erstellen Paket statt (Twisted/twisted/
, mit einem leerenTwisted/twisted/__init__.py
) und Platz Ihre Quelldateien in ihm. Zum Beispiel,Twisted/twisted/internet.py
.- setzen Sie Ihre Unit-Tests in einem Unterpaket des Pakets (Anmerkung - das bedeutet, dass die einzige Python-Quelldatei Option oben war ein Trick - man immer mindestens eine andere Datei benötigen für Ihre Einheit Tests). Zum Beispiel,
Twisted/twisted/test/
. Natürlich machen es ist ein Paket mitTwisted/twisted/test/__init__.py
. Die Prüfungen in Dateien wieTwisted/twisted/test/test_internet.py
.- hinzufügen
Twisted/README
undTwisted/setup.py
zu erklären und Installieren der Software bzw. wenn Sie das Gefühl schön.Sie nicht:
- setzen Sie Ihre Quelle in einem Verzeichnis namens
src
oderlib
. Das macht es schwer, läuft ohne Installation.- setzen Sie Ihre Tests außerhalb Ihrer Python-Paket. Das macht es schwer, die Tests gegen ein installiertes Version.
- ein Paket erstellen, das nur einen
__init__.py
hat und setzen Sie dann den gesamten Code in__init__.py
. So stellen Sie ein Modul anstelle eines Pakets, es ist einfacher.- versuchen, mit magischen Hacks zu entwickeln, um Python Lage zu machen das Modul importieren oder das Paket, ohne die Benutzer hinzufügen zu müssen das Verzeichnis enthält es um ihre Importpfad (entweder über oder
PYTHONPATH
ein anderer Mechanismus). Du wirst nicht korrekt verarbeiten alle Fälle und Benutzer an Sie werden wütend, wenn Ihr Software funktioniert nicht in ihrer Umwelt.
Andere Tipps
Distutils unterstützt Module, Pakete zu installieren, und Skripte . Wenn Sie ein distutils setup.py
schaffen, die als Paket und foo
als Skript foo.py
bezieht, dann sollte foo.py
auf /usr/local/bin
erhalten installiert oder was auch immer das entsprechende Skript Installationspfad auf dem Ziel-Betriebssystem ist, und das foo
Paket sollte das site_packages
Verzeichnis installiert werden .
Sie sollten die ausführbare Datei nur foo
nennen, nicht foo.py
, dann versucht foo importieren wird es nicht verwenden.
Wie es richtig zu benennen: das ist schwierig in der Zusammenfassung zu beantworten; wir müssten wissen, was konkret sie tut. wenn sie und steuert zum Beispiel konfiguriert, nannte es -config oder ctl könnte angemessen sein. Wenn es ein Shell-API für die Bibliothek ist, sollte es den gleichen Namen wie die Bibliothek haben.
Ihr CLI-Modul ist eine Sache, das Paket, das es ist eine andere Sache unterstützt. Verwechseln Sie nicht die Namen Modul foo
Withe (in einer Datei foo.py
) und das Paket foo
(in einem Verzeichnis foo
mit einer Datei __init__.py
).
Sie haben zwei Dinge genannt foo
: ein Modul und ein Paket. Was wollen Sie foo
nennen? Eine Klasse? Eine Funktion? Eine Variable?
Wählen Sie einen eindeutigen Namen für das foo-Modul oder das Paket foo. foolib
zum Beispiel ist ein beliebtes Paketnamen.