Das Opfer meiner selbst!

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo,

ich habe eine Frage an euch, denn mich interessieren eure Meinungen. Bevor ich aber zu der Frage komme, möchte ich eine kurze Geschichte erzählen.

Nun, ich schreibe in Python 2.7 unter Windows 7 Home mein kleines Projekt. Es ist wichtig zu wissen, dass ich mich für Desktop-Anwendung interessiere. Was ist passiert? Ich habe eine weile an meinem kleinen Projekt gearbeitet. Bis gestern hatte ich mein kleines Projekt schon eine ganze Weile nicht mehr unter Linux getestet. Ich benutze Debian 7 Wheezy. Was tat ich? Ich habe mein Projekt auf mein Debian-System kopiert, und versuchte mein Projekt zu starten. Mittlerweile vergaß ich, welche Bibliotheken abhängig sind. Die Abhängigkeiten sind mir völlig entgangen. Beim ersten Versuch mein kleines Projekt unter Debian zu starten begann damit, dass ich Fehlermeldungen bekam, dass einige Bibliotheken fehlten. Ich holte dann schnell alles über pip nach. Allerdings bekam ich bei der Bibliothek pyodbc Schwierigkeiten. Irgendwie wollte pip nicht richtig installieren. Jedenfalls hatte das Installieren dieser Bibliothek eine gefühlte Ewigkeit gebraucht. Irgendwann, so nach zirka 1-2 Stunden lief mein kleines Projekt auch unter Debian.

Warum ich euch das erzähle? Weil ich mich fragte, ob man das einem Anwender alles zumuten darf/soll? Ich bin kein Debian-Experte, sondern benutze Debian zeitweise nebenbei und selbst dabei hatte ich lange "rumfummeln" müssen. Gut, einige von euch würden dann aufschreien und meinen "Du musst eine setup.py-Datei schreiben. Aber macht man sowas nicht, wenn man sein Programm bei https://pypi.python.org hochladen will? Und ich denke, eine Desktop-Anwendung lädt man dort nicht hoch, sondern eher Bibliotheken. Also recherchierte ich weiter in Google und kam dann auf diese StackOverFlow-Seite und fand diesen Quelltext:

Code: Alles auswählen

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)
install_and_import('boto3 ')
Nun meine Frage an euch: Wäre dieser Weg "unschön"? Ich meine, unter Windows-Systeme gibt es ja Gott sei dank die Methode eine *-exe-Datei zu kreieren und man somit alle Abhängigkeiten mitbringt. Aber unter Linux sieht es leider anders aus. Ich fand diesen Quelltext daher interessant, weil der Anwender überhaupt nichts machen muss.

Und bevor wir uns missverstehen. Ich möchte mich nicht gegen irgendwelchen Standards auflegen. Ich hätte nur gern eure Meinung, und möchte gern was hinzulernen. Denn als ich heute versuchte mein kleines Projekt auf meinem Debian zum Laufen zu kriegen, merkte ich selbst am eigenen Leibe, wie aufwendig das war, und daher kam mir dann gleich die frage auf "Ernsthaft, kann man das von einem Linux-Anwender wirklich erwartet, dass er/sie die gleiche Tortur durchmachen muss?"
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: es gibt durchaus einige Projekte, die das Installationsproblem angehen. Bei VirtualEnv werden z.B. die Abhängigkeiten in einer Text-Datei aufgelistet. Dass irgend ein Programm ungefragt systemweit irgendwelche Pakete installiert, will niemand, und ich wäre ziemlich sauer auf den Programmierer, wenn ich das merken würde.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Genau dafür ist doch eine setup.py da! Ob du deinen Code hochladen willst oder nicht, sie installiert dir dein Programm auf dem System mit allen Dependencies. Ob du die setup.py dann in einem Virtualenv startest oder pip sagst es soll als user installiert werden (`pip install --user .` im Verzeichnis mit der setup.py), nebenbei kann dir die setup.py auch ein 'Start-Skript' in `~/.local/bin` bzw. `/usr/bin/` legen.

PS: Man muss nicht nur Bibliotheken auf pypi hochladen.
the more they change the more they stay the same
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Ist es auf Linuxsystemen nicht üblicher, die Installation von (größerer) Software nach Möglichkeit über den Paketmanager der jeweiligen Distribution abzuwickeln? Entsprechend könnte man von der eigenen Software Pakete für die gängigen Paketverwaltungen basteln. Mir ist es eine zentrale Paketverwaltung lieber, als die der jeweiligen Programmiersprachen (auch wenn dieser natürlich ihre Vorzüge haben). Pip habe ich bisher nur verwendet, wenn das gewünschte Paket nicht in den Repositorien verfügbar war; pip ist durch den Anschluss an Pypi natürlich weniger "reaktionsträge" und hinsichtlich des Bedarfs an unterschiedlichen Paketen und Paketversionen besser aufgestellt.
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sophus hat geschrieben:

Code: Alles auswählen

def install_and_import(package):
    import importlib
    try:
        importlib.import_module(package)
    except ImportError:
        import pip
        pip.main(['install', package])
    finally:
        globals()[package] = importlib.import_module(package)
install_and_import('boto3 ')
Kann man IMHO so machen. Aber ich würde zumindest eine Rückfrage einbauen, damit der Anwender weiß, was passiert und eine Entscheidung treffen kann.

``globals()[package] = importlib.import_module(package)`` finde ich übrigens merkwürdig. Ich würde da ganz einfach erneut den "normalen" import via ``import xyz`` durchführen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Sirius3: Das Beispiel mit pyodbc habe ich bewusst gewählt, weil die Installaton sehr aufwendig war. pip konnte die Bibliothek nicht problemblos installieten. Und das ich eine ganze Weile brauchte war schon erstaunlich. Kein normaler Anwender, der mit Programmierung nichts zu tun hat, würde sich den Leidensweg antun. Meine Idee ist außerdem, die benötigten Abhängigkeiten herunter zu laden und bei der Auslieferung des Projektes beizulegen. Denn im Grunde erspart sich der Anwender den Schritt sich alles über pip zu besorgen. Er könnte direkt mit der Installation beginnen?

@Dav1d: Wenn ich eine setup.py-Datei kreiiere und sie wird dann mit python setup.py install über Shell aufgerufen, dann landet mein Desktop-Programm in der Python-Bibliothek (site-packages). Und da gehört keine Desktop-Anwendung rein. Oder? Und noch was. Ich habe bei PyPi bisher noch nie eine Desktop-Anwendung gesehen. Über PyPi bezog ich stets Bibliotheken die ich brauchte.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

Sophus hat geschrieben:@Dav1d: Wenn ich eine setup.py-Datei kreiiere und sie wird dann mit python setup.py install über Shell aufgerufen, dann landet mein Desktop-Programm in der Python-Bibliothek (site-packages). Und da gehört keine Desktop-Anwendung rein. Oder? Und noch was. Ich habe bei PyPi bisher noch nie eine Desktop-Anwendung gesehen. Über PyPi bezog ich stets Bibliotheken die ich brauchte.
Wo gehört sie dann hin? `/usr/bin`, nicht wirklich, `/usr/lib` schon eher, `/usr/lib/python2.7` ist da aber auch (ggf. ersetzte `/usr` durch `~/.local`). `setup.py` gibt dir das dependency management das du brauchst, es ist cross-platform, was will man mehr. Ob man das ganze dann auf PyPi veröffentlich will oder nicht ist einem ja freigestellt (wobei das nicht ganz unüblich ist Programme auf PyPi zu veröffentlichen, z.B. sslstrip und mitmroxy sind zwei die mir gerade einfallen).
the more they change the more they stay the same
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@Dav1d: Sei mir nicht böse, aber ich habe das Gefühl, wir reden aneinander vorbei. Programme werden auf PyPi veröffentlich, aber doch keine Desktop-Anwendungen, die mit einer grafischen Oberfläche arbeiten. Dabei meine ich keine CLI-Programme, sondern Programme, die man unter Windows kennt. Ich sah zum Beispiel kein VLC für Linux in PyPi oder kein GIMP in PyPi. Und vor diesem hintergrund frage ich mich, was eine Desktop-Anwendung, so wie ich sie verstehe, in einer Bibliothek zu suchen hat. Eine Bibliothek ist eine Bibliothek, und eine grafische Desktop-Anwendung ist eine grafische Desktop-Anwendung. Ich bin mir sicher, dass ich etwas falsch betrachte.
BlackJack

@Sophus: Unter Linux ist es üblich Pakete für die jeweilige Distribution zu erstellen, damit kann der Benutzer sich das inklusive Abhängigkeiten so installieren wie er auch so ziemlich jede andere Software auf seinem System installiert hat. Alternativ bietet man dann, genau wie bei Programmen in anderen Programmiersprachen, normalerweise den Quelltext an. Mit einer `setup.py`. Da muss der Benutzer dann gegebenfalls Ahnung haben, insbesondere wenn die Installation nicht reibungslos klappt. Aber das ist ja bei anderer Software die als Quelltext geliefert wird, nicht anders. Das ``python setup.py install`` ist dann vergleichbar mit einem ``make install`` bei einem C- oder C++-Programm. Wenn das durchläuft ist's gut, falls nicht, muss derjenige der das macht halt schon ein bisschen Wissen mitbringen was da tatsächlich hinter den Kulissen so passiert.

Wieso gehören Desktop-Anwendungen nicht nach `site-packages` oder `dist-packages`? Da spricht zumindest unter Linux IMHO nichts dagegen und es ist auch ziemlich einfach per `setup.py` zu machen. Die Anwendung ist dann ein Package und als Script gibt man in der `setup.py` ein ganz einfaches Skript an, welches einfach nur das Package importiert und eine darin enthaltene `main()`-Funktion aufruft. Es gibt auch Desktopanwendungen die das so machen. Gerade eben eine benutzt: pyrenamer — eine Desktopanwendung zum massenhaften umbenennen von Dateien in dem man beispielsweise Metadaten aus der Datei in den Dateinamen holen kann. TortoiseHg benutze ich auch fast täglich, das funkioniert auch so. Und ich bin mir sicher, andere ebenfalls.
Dav1d
User
Beiträge: 1437
Registriert: Donnerstag 30. Juli 2009, 12:03
Kontaktdaten:

@Sophus: Denke nicht, dass wir aneinander vorbeireden. VLC ist nicht in Python geschrieben, GIMP auch nicht, aber beide kann man in den meisten Distributionen per Packagemanager installieren, PyPi ist halt ein Packagemanager von und für Python und `setup.py` das Makefile. Btw. eine TUI ist genauso ein UI wie eine GUI (mitmproxy).
the more they change the more they stay the same
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

@BlackJack: Daran sieht man mal, dass ich noch einiges zu lernen habe. Ich hätte echt nicht angenommen, dass die in Python geschriebene Desktop-Anwendungen in site-packages gehören. Ich habe es immer streng gesehen, so nach dem Motto "Dort komme nur Bibliotheken rein". Um zu versuchen deine Frage zu beantworten, das dagegen spreche, wenn man Desktop-Anwendungen in site-packages installiert. Antwort: Ich dachte eher, dass dadurch der packages-Ordner unnötig zugemüllt wird und die Übersicht schnell verloren geht. Aber jetzt bin ich schlauer. Zu dem Quelltext. Wird unter Linux nicht sowieso das Programm in Quelltext-Form ausgeliefert? Ich wüsste sonst nicht, wie ich mein kleines Mini-Python-Projekt unter Linux sonst ausliefern sollte. Und zu deiner Anmerkung , als du meintest, man solle Pakete für die jeweilige Distribution erstellen. Meinst du damit diese *.tar.gz und/oder *.deb Pakete? Wenn ja, dann bin ich ein wenig verwirrt, insbesondere bei *.tar.gz. Ich meine, man entpackt dieses Paket einfach mit tar -xvzf my_little_project.tar.gz. Danach folgt doch keine Überprüfung der Abhängigkeiten, richtig?

@Dav1d: Das mit VLC und GIMP war ein blödes Beispiel von mir. Ich habe beim Schreiben nicht wirklich nachgedacht.
BlackJack

@Sophus: Paket für die jeweilige Distribution meint das Format mit dem dort üblicherweise Software installiert wird. Bei Debian wären das DEB-Pakete, bei SuSE RPM-Pakete, und so weiter. *.tar.gz würde ich als (komprimiertes) Archiv bezeichnen.
Antworten