Verteilen einer Python-Anwendung
-
19-09-2019 - |
Frage
Ich habe eine einfache Python-Anwendung, wo meine Verzeichnisstruktur folgt, ist wie:
- Projekt /
- main.py
- config.py
- plugins /
- plugin1
- plugin2
- ...
Config.py nur Lasten Konfigurationsdateien, es enthält keine Konfigurationsinformationen in sich selbst.
Ich möchte jetzt dieses Programm verteilen, und ich dachte, ich Setuptools, es zu tun verwenden würde. Die Datei Benutzer sind zu erwarten ist main.py, so dass man geht eindeutig in / usr / sind und der Rest der Dateien geht in / usr / share / Projekt.
Aber es gibt ein Problem: Ich würde irgendwie main.py muß sagen, für config.py im Aktienbuch zu suchen. Aber ich kann wirklich nicht sicher sein, wo genau das Freigabeverzeichnis ist da, das ist bis zu Setuptool, nicht wahr?
Was ist die beste Praxis bei der Verteilung von Python-basierte Anwendungen?
Lösung
Setuptools Ihr Paket an einer Stelle installieren, die von Python heißt erreichbar ist, können Sie sie importieren:
import project
das Problem zu erhöhen, wenn Sie relative Importe anstelle von absoluten Importen tun. wenn Ihr main.py
Importe config.py
funktioniert es, weil sie im selben Verzeichnis befinden. wenn Sie Ihre main.py
an einem anderen Ort wie /usr/bin
oder einen anderen Ort in PATH Umgebungsvariable, Python versucht Import config.py
von sys.path
und nicht von Ihrem Paket dir bewegen. die Lösung ist absolut Import zu verwenden:
from project import config
Jetzt main.py
ist "beweglich".
Eine andere Lösung, die ich bevorzuge, ist die Verwendung von automatischen Skripterstellung angeboten von Setuptools .
anstelle des Codes mit in einem
if __name__ == "__main__":
# here all your beautiful code
Anweisung, setzen Sie Ihren Code in einer Funktion (Haupt einen guten Namen sein könnte):
def main():
# put your code here
if __name__ == "__main__": # not needed, just in case...
main()
Jetzt ändern Sie Ihre setup.py
:
setup(
# ...
entry_points = {
"console_scripts": [
# modify script_name with the name you want use from shell
# $ script_name [params]
"script_name = project.main:main",
],
}
)
das ist alles. nach einer Installation Setuptools wird ein Wrapper-Skript erstellen, die von Shell aufrufbar ist und dass Anrufe Ihre Hauptfunktion. jetzt main.py
kann in Ihrem Projektverzeichnis lebt und Sie brauchen nicht mehr in einem bin/
Verzeichnis zu verschieben. Beachten Sie, dass Setuptools setzt automatisch das Skript im bin/
Verzeichnis in Bezug auf die Installation Präfix.
es.
python setup.py install --prefix ~/.local
Installieren des Projektpaketes in
~/.local/lib/python<version>/site-packages/<package_name>
und Ihr Skript in
~/.local/bin/<script_name>
so sicher sein, dass ~/.local/bin
vorhanden ist in der PATH env.
Weitere Informationen unter: http://peak.telecommunity.com/DevCenter / Setuptools # automatische-Skript-Erstellung