Python Script über JavaScript ausführen?

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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");

FrozenArmy 
Beitragsersteller
 28.05.2023, 14:37

Habe jetzt folgendes in meiner PHP-Datei versucht:

<?php shell_exec("/bin/python3 /opt/lampp/htdocs/protected/main_discord.py &"); ?> 

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.

regex9  28.05.2023, 15:47
@FrozenArmy
  1. Funktioniert der Systembefehl generell, wenn du ihn manuell in der Konsole aufrufst?
  2. 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);
FrozenArmy 
Beitragsersteller
 28.05.2023, 19:22
@regex9
  1. Ja, der Befehl funktioniert sonst einwandfrei mit der Konsole.
  2. Also, keine Ahnung ob es irgendwas anzeigen müsste wenn ich deine Code-Zeilen einfüge, aber da tut sich nichts...
FrozenArmy 
Beitragsersteller
 28.05.2023, 19:27
@FrozenArmy

Meine PHP-Version ist übrigens 8.2.0, falls das hilft.

regex9  29.05.2023, 07:25
@FrozenArmy

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.

FrozenArmy 
Beitragsersteller
 29.05.2023, 14:39
@regex9

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.

regex9  30.05.2023, 04:11
@FrozenArmy

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.

FrozenArmy 
Beitragsersteller
 01.06.2023, 15:57
@regex9

Gibt tatsächlich eine Fehlermeldung:
"/bin/python3: symbol lookup error: /bin/python3: undefined symbol: XML_SetHashSalt "

regex9  03.06.2023, 02:05
@FrozenArmy

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.

FrozenArmy 
Beitragsersteller
 08.06.2023, 16:38
@regex9

Und wie kann ich dieses Problem beheben?

regex9  10.06.2023, 02:13
@FrozenArmy

Gib im Shell-Befehl einen richtigen Pfad für den Python-Interpreter an.

FrozenArmy 
Beitragsersteller
 13.06.2023, 19:17
@regex9

Aber wenn ich den Pfad im Terminal benutze, funktioniert er ja, wüsste jetzt nicht was an dem Pfad "falsch" sein sollte.

FrozenArmy 
Beitragsersteller
 22.06.2023, 18:32
@regex9

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


FrozenArmy 
Beitragsersteller
 27.05.2023, 11:25

Wüsste jetzt aber nicht, wonach ich suchen sollte wenn ich es serverseitig machen möchte.

alexthenr14  27.05.2023, 11:46
@FrozenArmy

Suche nach "python server website"

Python kann nämlich auch statt PHP oder NodeJS eingesetzt werden ist aber nicht so verbreitet