Python Script über JavaScript ausführen?
Ich habe einen Home-Server im Heimnetz und möchte über die Website, die ich dort aufgesetzt habe, per JavaScript (außer es gibt eine bessere Möglichkeit) eine Python-Datei starten/ausführen.
Weiß jemand wie sich das realisieren lässt?
3 Antworten
a) Du kannst die serverseitige Webanwendung mit Python realisieren. Ein Microframework wie Bottle, Flask oder CherryPy reicht dafür aus. Den Webserver müsstest du entweder entsprechend konfigurieren (für Apache gibt es bspw. das mod_wsgi-Modul) oder du tauschst den Webserver generell aus (bspw. gegen Gunicorn).
b) Wenn du bereits eine serverseitige Webanwendung mit einer Technologie wie PHP, Node.js, o.ä. entwickelt hast, wäre die erste Option natürlich etwas ungünstig, da du ja nicht alles neu implementieren möchtest. In der Regel gibt es bei serverseitigen Webtechnologien die Möglichkeit, via Funktion Systembefehle an das OS zu schicken und somit also auch Python-Skripte zu starten (sofern ein Python-Interpreter installiert ist). In PHP gibt es bspw. die shell_exec-Funktion, Node.js hat sein child_process-Modul mit der exec-Funktion.
c) Solltest du in die Richtung tendieren, das Python-Skript so wie im vorherigen Absatz beschrieben, aufzurufen, dann kann man auch einmal hinterfragen, ob dein Python-Skript wirklich so Python-spezifisch ist (bspw. bestimmte Bibliotheken verwendet, die nur in Python verfügbar sind) bzw. ob es nicht auch mit PHP/Node.js/... implementiert werden könnte.
Hinsichtlich des Triggers, der die Ausführung auslöst, sollte im einfachsten Fall ein GET-Request ausreichen. Man kann einen einfachen Link nutzen:
<a href="/start">Start Python script</a>
Die Zieladresse verweist auf einen Request-Handler / ein Skript, welches das Python-Skript/den Python-Code ausführt.
Mit JavaScript kannst du ebenso GET-Requests abfeuern. Entweder du lässt die Zieladresse direkt vom Browser laden:
location.href = "/start";
oder du schickst einen AJAX-Request:
fetch("/start");
- Funktioniert der Systembefehl generell, wenn du ihn manuell in der Konsole aufrufst?
- Mit der exec-Funktion (statt shell_exec) kannst du dir auch die Ausgaben/Rückgaben des Skripts einfacher heranholen. Vor der Funktion wäre es günstig, temporär einmal die Ausgabe aller Fehlermeldungen und Warnungen zuzulassen.
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
- Ja, der Befehl funktioniert sonst einwandfrei mit der Konsole.
- Also, keine Ahnung ob es irgendwas anzeigen müsste wenn ich deine Code-Zeilen einfüge, aber da tut sich nichts...
Meine PHP-Version ist übrigens 8.2.0, falls das hilft.
Was liefert das Shell-Skript zurück? Es muss Rückgaben geben, was vom System ausgeführt wurde. Lass dir das mittels var_dump ausgeben.
Also wenn ich jetzt
var_dump(shell_exec("/bin/python3 /opt/lampp/htdocs/protected/main_discord.py"));
ausführe, bekomme ich NULL zurückgeliefert.
Bei bspw.
var_dump(shell_exec("ls -l"));
bekomme ich allerdings das gewünschte Ergebnis.
Wenn ich die Befehle jedoch im Terminal ausführe funktionieren allerdings beide.
Liegt der Python-Interpreter nicht in /usr/bin und heißt python?
Ansonsten ist diese Rückgabe nicht aussagekräftig. Verwende exec oder lass dir die Fehlermeldung mit in den Ausgabekanal schreiben, indem du
2>&1
an den Shell-Befehl hängst.
Gibt tatsächlich eine Fehlermeldung:
"/bin/python3: symbol lookup error: /bin/python3: undefined symbol: XML_SetHashSalt "
Ich gehe nach wie vor davon aus, dass der Python-Interpreter über deine Angabe nicht gefunden werden kann. Bei Ausführung des Befehls wird nun sicherlich in den Verzeichnissen, auf die die Umgebungsvariable LD_LIBRARY_PATH zeigt, erfolgslos nach /bin/python3 gesucht.
Gib im Shell-Befehl einen richtigen Pfad für den Python-Interpreter an.
Aber wenn ich den Pfad im Terminal benutze, funktioniert er ja, wüsste jetzt nicht was an dem Pfad "falsch" sein sollte.
Aber wenn ich den Pfad im Terminal benutze, funktioniert er ja, wüsste jetzt nicht was an dem Pfad "falsch" sein sollte.
Was spricht dagegen die Python-Datei direkt zu starten? Also wofür brauchst Du konkret JS oder umgekehrt, warum muß der Pythonteil in Python sein?
Die Antwort von RegExp ist zwar recht ausführlich, aber es fehlen noch Dinge:
Wenn es nur darum geht das Script auszuführen und es etwas anzeigen zu lassen reicht sogar schon sowas wie SSI, bei Interaktion kann das Pythonskript als CGI (et. al.) ausgeführt werden.
Für Server wie Apache gibt es auch mod_python.
Zu guter Letzt kannst Du in (fast) jeder Sprache andere Executeables ausführen, so dann auch das Pythonskript. Wenn es opportun ist, können auch beide Komponenten über IPC Daten tauschen/kommunizieren.
Es gibt also immer eine ganze Reihe an Wegen (achja, Python kann auch gleich den ganzen HTTP-daemon stellen, wenn einem das besser gefällt, mit Framework wirds halt bequemer).
Es ist möglich, wie z.b. mit https://pyscript.net/
Aber es wäre besser es serverseitig zu machen
Wie das funktioniert gibt es genug tutorials auf Youtube
Wüsste jetzt aber nicht, wonach ich suchen sollte wenn ich es serverseitig machen möchte.
Suche nach "python server website"
Python kann nämlich auch statt PHP oder NodeJS eingesetzt werden ist aber nicht so verbreitet
Habe jetzt folgendes in meiner PHP-Datei versucht:
Ich möchte erreichen, das mein Discord Bot ausgeführt wird, aber nichts passiert.
Wenn ich die Python Datei starte, funktioniert es aber, mit der PHP-Datei nicht.